【问题标题】:For loops in matlab only iterate 128 timesmatlab中的for循环只迭代128次
【发布时间】:2019-05-03 17:42:33
【问题描述】:

我正在尝试在 MATLAB 中编写拉普拉斯边缘检测滤波器。

我有 4 个嵌套的 for 循环。前两个遍历图像中的每个像素,后两个遍历围绕该像素的 9x9 矩阵。对于每次迭代,代码将矩阵的每个单元与其对应的像素相乘,并添加到矩阵的总和中。

问题在于前两个 for 循环似乎只迭代了 128 次,如上图 here. 所示

我知道 for 循环没有问题,因为为了调试,我将输出图像的每个像素设置为等于输入图像,并且它工作正常,如底部图像所示。

for x = 1: imgWidth
    for y = 1: imgHeight 
        sum = 0;
        for maskX = (-1 * n):(n)
            for maskY = (-1*n): (n)
                if ((x + maskX) >= 1 && (x + maskX) <= imgWidth && (y + maskY) >= 1 && (y + maskY) <= imgHeight) 
                    sum = sum + int16(IMG(x + maskX,y + maskY)) * int16(mask(maskX + n + 1,maskY + n + 1)) ;
                end
            end
        end
        finalValue = (sum - minSum)/mult;
        rFinal(x,y) = finalValue;
    end
end

结果应该是主图像的边缘。如果没有边缘,像素的值应该是 127,但是如果有边缘,边缘的一侧会很暗,包含较低的像素值,而边缘的另一侧应该是明亮的并且包含较高的像素值像素值。第一个 128x128 像素块就是这种情况,但是对于图像的其余部分,结果是出乎意料的。无论我输入什么尺寸的图像,结果只会对那个 128x128 的小块正确。

有人知道为什么会这样吗?会不会是 MATLAB 的内存溢出问题?当我运行程序时,我的计算机上的 cpu 使用率不到 50%,所以我怀疑这是问题所在。我也怀疑代码有问题,因为我已经检查了它并多次测试了它,但如果你发现了什么,请不要犹豫指出它!谢谢!

【问题讨论】:

  • 如果您发生内存溢出,MATLAB 会在您的控制台中大发雷霆并停止。你会知道的。如果您的代码确实只按照您的描述执行(我们无法确定,因为您的代码不完整,我们无法运行它),那是因为它是这样编码的。我首先要检查的是imgWidthimgHeight 的值,就在您进入循环之前
  • 请填写您的代码,请参阅minimal reproducible example。可能的问题可能是nint8。 -- 顺便说一句,你应该简单地写-n:n,你也不应该把你的像素值转换成int16,把它们转换成double,这是MATLAB的原生,最自然的类型。如果您使用double,一切都会更好!

标签: matlab


【解决方案1】:

要使用mask 给出的线性过滤器过滤您的图像IMG,请使用conv2

conv2(IMG,mask,'same');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多