【问题标题】:Matlab create window on imageMatlab在图像上创建窗口
【发布时间】:2018-08-30 18:31:09
【问题描述】:

我需要创建一个 16X16 的窗口来在 matlab 中扫描整个图像,并记录窗口中灰度级最大的像素的位置和灰度值。

谁能指导我如何做到这一点?在图像上创建窗口时找不到任何帮助。

谢谢

【问题讨论】:

  • 那么,位置向量的长度与像素数相同,对吧?因为它适用于每个像素?

标签: matlab


【解决方案1】:

只是为了好玩,这是实现此目的的另一种方法:将窗口中最大值的强度和位置存储为复数的实部和虚部。然后可以使用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))):

【讨论】:

    【解决方案2】:

    老派的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
    

    【讨论】:

    • 你能解释一下为什么你从 cols 行的长度中减去 15 吗?
    • @user1853871 因为您正在滑动大小为 16 的窗口,并且 k1 和 k2 表示沿行和列的起始索引。
    • 啊好吧!谢谢。因此,如果我使用 32x32 的窗口,我只需减去 31?
    • 是的!但这是用于滑动窗口的情况,请记住这一点。
    • 谢谢,滑动窗口正是我所需要的!
    【解决方案3】:

    你可以这样做:

    % 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) 的信息,其中包含以下字段:

    • window(r,c).largest:最大像素的灰度
    • window(r,c).row, window(r,c).col:原图上最大像素的位置

    【讨论】:

    • 不客气。我忘记提到的一件事是:如果有两个或多个最大像素(都具有相同的灰度级),代码将使用顺序索引选择第一个作为行/列坐标。如果您想要它们的坐标,只需将 find 行更改为 find(window == largest);,现在 row/col 将成为每个窗口中所有最大像素坐标的向量。
    • 谢谢,你能给我解释一下 r = (row - 1) / N + 1; c = (col - 1) / N + 1;有吗?
    • 当然。假设您的图像是 48x48 像素。因此,有 3x3 的窗口。两个 for 中的变量 rowcol 将采用值 1、17 和 33,它们是每个窗口的起始位置。你问的那两行将它们分别转换为 1、2 和 3,它们是每个窗口的索引。
    • 谢谢。我现在对算法的下一步感到困惑......如果最大像素周围的像素与最大像素灰度值一样亮并且外部像素比最大像素灰度值暗则最大像素位置是中心像素的投资回报率。你能告诉我如何从获取最大像素周围的像素开始吗?
    • 很高兴我能帮上忙。我是 Stackoverflow 的新手,但我认为您应该通过创建另一个问题来问这个问题,因为这是一个新问题。
    【解决方案4】:

    您需要的关键步骤是在给定的扫描窗口(即矩形区域)中提取子图像。如果扫描窗口,比如roi 格式为[x, y, width, height],您可以直接调用imcrop

    subImage = imcrop(Image, roi);
    

    然后你可以在子图像中找到最大灰度,像这样

    [value, location] = max(subImage(:));
    

    当然,您需要更新扫描窗口,即roi,以便扫描整个图像。

    【讨论】:

    • 感谢 roi 中的 X 和 Y 代表什么?
    • 我不确定如何移动窗口以便扫描整个图像
    猜你喜欢
    • 2014-06-02
    • 1970-01-01
    • 2017-10-28
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2020-01-26
    相关资源
    最近更新 更多