因此我需要在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));
有没有人对可能发生的原因以及我的方法是否正确获得梯度/高斯衍生物有任何想法?
答案 0 :(得分:2)
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')
结果如下:
答案 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
图像时:
...当我运行此代码时,我使用onion.png
获取此图片:
请注意差异滤波器分别应用于每个通道,并且我更改了每个通道的强度,以便将最小值映射到0并将最大值映射到1.如何解释此图像是任何areasthat具有非黑色的颜色具有一些非零差异,因此在这些区域中存在一些活动,并且具有深色/黑色的任何区域意味着在这些区域中没有活动。请注意,我们应用了一个水平过滤器,因此如果您想垂直执行此操作,则只需重复该行为,但应按照上述方式逐列而不是按行进行。
答案 2 :(得分:1)
如果你的目标是使用diff
来生成导数而不是创建一个循环,你可以告诉diff
给你x方向的导数(沿着维度2):
newImage = diff(double(origImage), 1, 2);
1
用于一阶导数,2
用于第二维导数。请参阅diff。
正如@rayryeng在回答中提到的那样,将图像转换为double
非常重要。