Matlab:获取图像衍生物的麻烦?

时间:2016-03-02 04:28:45

标签: matlab image-processing filtering gaussian

因此我需要在x方向上获取图像的导数以进行此分配,目标是获得某种形式的渐变。我的想法是在图像的每一行上使用diff(命令),然后应用高斯滤波器。我没有开始第二部分,因为第一部分是给我带来麻烦。在尝试获得x衍生物时,我有:

origImage = imread('TightRope.png');

for h = 1:3 %%h represents color channel
    for i = size(origImage,1)
        newImage(i,:,h) = diff(origImage(i,:,h));  %%take derivative of row and translate to new row 
    end
end

问题出在我收到错误'Subscripted assignment dimension mismatch'的方式。

Error in Untitled2 (line 14)
    newImage(i,:,h) = diff(origImage(i,:,h));

有没有人对可能发生的原因以及我的方法是否正确获得梯度/高斯衍生物有任何想法?

3 个答案:

答案 0 :(得分:2)

为什么不将fspecialimfilter一起使用?

figure;

I = imread('cameraman.tif');

subplot 131; imshow(I); title('original')

h = fspecial('prewitt');
derivative = imfilter(I,h','replicate'); %'

subplot 132; imshow(derivative); title('derivative')

hsize = 5;
sigma = 1;

h = fspecial('gaussian', hsize, sigma) ;
gaussian = imfilter(derivative,h','replicate'); %'

subplot 133; imshow(gaussian); title('derivative + gaussian')

结果如下:

enter image description here

答案 1 :(得分:1)

给定N元素向量,diff返回N-1长度向量,因此您获得对齐不匹配的原因是因为您尝试分配{{}的输出1}}到不正确的插槽数。具体地说,假设diff是列的总数,您在N向量上使用diff,从而返回1 X N向量,并且您尝试分配此输出作为输出图像中的单行,预计为1 x (N - 1)。缺少的元素导致对齐不匹配。 1 x N通过在向量中获取元素对并减去它们以产生新元素来工作,因此最终输出中缺少一个元素的原因。

如果你想让你的代码工作,一种方法是填充图像或信号向量的每一行,并附加零(例如)作为diff的输入。像这样的东西可以工作。请注意,我会将您的图片转换为diff,以允许衍生品采用负值:

double

请注意,您的origImage = imread('...'); %// Place path to image here and read in origImage = im2double(origImage); %// Change - Convert to double precision newImage = zeros(size(origImage)); %// Change - Create blank new image and populate each row per channel manually for h = 1:3 %%h represents color channel for ii = 1:size(origImage,1) %// Change - fixed for loop iteration newImage(ii,:,h) = diff([0 origImage(ii,:,h)]); %// Change end end 循环不正确,因为它没有遍历每一行......只是最后一行。

当我使用图像处理工具箱的for图像时:

enter image description here

...当我运行此代码时,我使用onion.png获取此图片:

enter image description here

请注意差异滤波器分别应用于每个通道,并且我更改了每个通道的强度,以便将最小值映射到0并将最大值映射到1.如何解释此图像是任何areasthat具有非黑色的颜色具有一些非零差异,因此在这些区域中存在一些活动,并且具有深色/黑色的任何区域意味着在这些区域中没有活动。请注意,我们应用了一个水平过滤器,因此如果您想垂直执行此操作,则只需重复该行为,但应按照上述方式逐列而不是按行进行。

答案 2 :(得分:1)

如果你的目标是使用diff来生成导数而不是创建一个循环,你可以告诉diff给你x方向的导数(沿着维度2):

newImage = diff(double(origImage), 1, 2);

1用于一阶导数,2用于第二维导数。请参阅diff

正如@rayryeng在回答中提到的那样,将图像转换为double非常重要。