【发布时间】:2018-08-30 18:31:09
【问题描述】:
我需要创建一个 16X16 的窗口来在 matlab 中扫描整个图像,并记录窗口中灰度级最大的像素的位置和灰度值。
谁能指导我如何做到这一点?在图像上创建窗口时找不到任何帮助。
谢谢
【问题讨论】:
-
那么,位置向量的长度与像素数相同,对吧?因为它适用于每个像素?
标签: matlab
我需要创建一个 16X16 的窗口来在 matlab 中扫描整个图像,并记录窗口中灰度级最大的像素的位置和灰度值。
谁能指导我如何做到这一点?在图像上创建窗口时找不到任何帮助。
谢谢
【问题讨论】:
标签: matlab
只是为了好玩,这是实现此目的的另一种方法:将窗口中最大值的强度和位置存储为复数的实部和虚部。然后可以使用nfilter函数进行移动过滤:
fun = @(x) complex(double(max(x(:))),double(find(x==max(x(:)), 1, 'first')));
B = nlfilter(YourImage,[16 16],fun);
然后您可以从复杂地图中访问最大值及其位置。以下是应用于this post 中给出的图像之一时的结果示例:
附近的最大强度 (imagesc(real(B))):
最大值的位置(imagesc(img(B))):
【讨论】:
老派的for循环方法-
%%// Outputs that you are interested in are - img, x1 and y1
img = rgb2gray(input_image); %%// Gray level values
x1 = zeros(size(img)); %%// Row values for the maximum pixel in the 16x16 window
y1 = zeros(size(img)); %%// Column values for the maximum pixel in the 16x16 window
for k1= 1:size(img,1)-15
for k2= 1:size(img,2)-15
img1 = img(k1:k1+15,k2:k2+15);
[val,ind1] = max(img1(:));
img(k1+8,k2+8)=val; %%// Store the max grey value into the image
[x1(k1,k2),y1(k1,k2)] = ind2sub([16 16],ind1);
end
end
编辑 1: 要计算此滑动窗口的平均值,请使用 -
window_size = 16; %%// Edit this to your window size
wsz = window_size-1;
mp = round(window_size/2);
%%// Outputs that you are interested in are - img, x1 and y1
img = rgb2gray(input_image); %%// Gray level values
x1 = zeros(size(img)); %%// Row values for the maximum pixel in the 16x16 window
y1 = zeros(size(img)); %%// Column values for the maximum pixel in the 16x16 window
img1 = img;
for k1= 1:size(img,1)-wsz
for k2= 1:size(img,2)-wsz
window_data = img(k1:k1+wsz,k2:k2+wsz);
val = round(mean(window_data(:)));
img1(k1+mp,k2+mp)=val; %%// Store the mean grey value into the image
end
end
figure,imshow(img1)
编辑 2:
img1 = Z;
for k1= 1:size(Z,1)-wsz
for k2= 1:size(Z,2)-wsz
window_data = Z(k1:k1+wsz,k2:k2+wsz);
val = mean(window_data(:))
if (val~=0)
keyboard;
error('Look, there is a non-zero mean value!');
end
% img1(k1+mp,k2+mp)=val; %%// Store the mean grey value into the image
display(val);
end
end
【讨论】:
你可以这样做:
% img = [matrix representing your image]
N = 16;
window = repmat(struct, ceil(size(img, 1) / N), ceil(size(img, 2) / N));
for row = 1:N:size(img, 1)
for col = 1:N:size(img, 2)
r = (row - 1) / N + 1;
c = (col - 1) / N + 1;
imgWindow = img(row:min(end,row+N-1), col:min(end,col+N-1));
largest = max(imgWindow(:));
[rLarg, cLarg] = find(imgWindow == largest, 1, 'first');
window(r, c).largest = largest;
window(r, c).row = rLarg + row - 1;
window(r, c).col = cLarg + col - 1;
end
end
您将有一个名为 window 的矩阵,其中 window(r,c) 包含有关窗口 (r,c) 的信息,其中包含以下字段:
【讨论】:
find(window == largest);,现在 row/col 将成为每个窗口中所有最大像素坐标的向量。
您需要的关键步骤是在给定的扫描窗口(即矩形区域)中提取子图像。如果扫描窗口,比如roi 格式为[x, y, width, height],您可以直接调用imcrop:
subImage = imcrop(Image, roi);
然后你可以在子图像中找到最大灰度,像这样
[value, location] = max(subImage(:));
当然,您需要更新扫描窗口,即roi,以便扫描整个图像。
【讨论】: