matlab对图像添加伪影

您好!如有打扰,请谅解,本人最近在准备毕业论文设计,需要用到一个给图像添加伪影的MATLAB程序,在百度上有看到一个,但是运行有误,对语句不是很理解,需要您的帮助,改正一下程序。十分感谢!程序如下:


function [fin] =getEll(im,a,b,px,py,value,range) 
% im:function just aplly his scale 
% a: Major axis of ellipse
% b: Minor axis of ellipse
% px: the centerX
% py: the centerY
% value: gray value
% range: thickness 
[x,y] =size(im);
temp = zeros(x,y); 
Cx = px;
Cy = py;
for i = Cx:x
    for j = Cy:y
        if(abs(1-((i-Cx)^2/a^2+(j-Cy)^2/b^2))<=range)
            temp(i,j)= value;
            tx = Cx-(i-Cx);
            ty = Cy-(j-Cy);
            if tx <= 0
                tx = 1;
            end
            if ty <=0
                ty = 1;
            end
            temp(tx,ty+1) = value; %In order to avoid 0,+1
            temp(tx+1,j) = value;
            temp(i,ty+1) = value;
        end
    end
end
fin = temp;

参考GPT和自己的思路:

你好,关于该 MATLAB 程序的问题,我看到程序中有一些语句及变量名命名不规范,建议先对其进行优化。同时,在程序运行过程中可能会出现以下问题和需要改正的地方:

  1. 在循环语句中,一开始的循环初始值将会导致对图像进行左上角(1,1)到目标点的扫描,这可能会导致程序运行太慢或出现错误。可以将循环的起始点改成给定的中心点 Cx 和 Cy,从而缩小扫描范围,提高程序效率。

  2. 在程序中的 if 语句中,当 i 和 j 超出了图像尺寸时可能会出现数组访问越界的问题。可以将 i 和 j 的循环终止条件由 x 和 y 改成 x-a 和 y-b,从而避免出现此类问题。

  3. 在写入数组 temp 的语句中,ty+1 有可能会和 Cx 或 Cy 的值相同,因此要避免往后写入 gray value,可以通过改变写入顺序将写入 tx 和 ty+1 的语句与 i j 的比较语句互换位置。

  4. 在一般情况下,为方便后续使用,不在函数内部做调整输出数组的尺寸大小,可以直接在调用该函数时使用类似 imresize 函数对输出图像做尺寸大小调整。

希望我的回答对你有所帮助!

参考GPT和自己的思路:

好的,这个MATLAB程序的目的是在图像中添加一个椭圆形状的伪影。针对您提出的问题和程序的实现,以下是我的建议:

  1. 第一行的函数名称 "getEll" 应该修改为 "addEllipseShadow" (或者其他更具描述性的名称),这样可以更准确地表达函数的目的。

  2. 在第二行中,函数的输出参数 "fin" 应该改为 "shadow",更好地表示输出的结果是伪影。

  3. 第三行注释中,“function just aplly his scale" 可以删除,因为这句话并没有对程序的理解提供任何有用的信息。

  4. 第四行到第九行中,函数的输入参数需要进行解释。其中,a 和 b 分别表示椭圆的两个轴的长度;px 和 py 表示椭圆中心点的横坐标和纵坐标;value 表示伪影的灰度值;range 表示伪影的厚度范围。这些注释应该更清楚地指出参数的意义和使用方法。

  5. 在第11行中,临时图像矩阵 "temp" 被初始化为全0。这个步骤可以通过在第14行之前添加代码 "temp = im",从输入图像中复制一份图像信息进行初始化。

  6. 在第14行中,应当从 "Cx" 开始循环,而不是从 "Cx" 到 "x" 循环。

  7. 在第15行中,循环变量 "j" 应该从 "Cy" 开始,而不是从 1 开始。

  8. 在第16行中,计算椭圆内部点的方法不正确,应该使用椭圆方程的形式,即:
    (((i-Cx)/a)^2+((j-Cy)/b)^2) <= 1+range

  9. 在第26到28行中加入了防止数组索引为 0 或负数的判断。这个判断是有必要的,但是需要将判断条件修改为:
    if tx < 1
    tx = 1;
    end
    if ty < 1
    ty = 1;
    end

经过以上修改,修正后的 MATLAB 代码如下:

function [shadow] = addEllipseShadow(im,a,b,px,py,value,range)
% Adds an ellipse-shaped shadow to an image.
% im: input image
% a: major axis of ellipse (in pixels)
% b: minor axis of ellipse (in pixels)
% px: X-coordinate of center of ellipse
% py: Y-coordinate of center of ellipse
% value: gray value of shadow
% range: shadow thickness (in pixels)
[x,y] = size(im);
temp = im;
Cx = px;
Cy = py;
for i = Cx:x
    for j = Cy:y
        if (((i-Cx)/a)^2+((j-Cy)/b)^2) <= 1+range
            temp(i,j)= value;
            tx = Cx-(i-Cx);
            ty = Cy-(j-Cy);
            if tx < 1
                tx = 1;
            end
            if ty < 1
                ty = 1;
            end
            temp(tx,ty+1) = value; %In order to avoid 0,+1
            temp(tx+1,j) = value;
            temp(i,ty+1) = value;
        end
    end
end
shadow = temp;

看下是不是你的参数和作者规定的不符

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^