【问题标题】:Save wanted image pixels in different matrix in Matlab?在 Matlab 的不同矩阵中保存想要的图像像素?
【发布时间】:2013-09-12 09:02:17
【问题描述】:

我是 matlab 和编程新手。我有一个大小为 [640 780] 的 RGB 图像。现在假设我只需要那些红色值超过 100 并且剩余的像素较少的像素我转换为 255。现在我想知道如何将这些需要的像素存储在不同的矩阵中,以便我可以直接使用这些值在原始 RGB 图片中导航以绘制 ROI ???

a = 1; b = 1;
maybe_red = RGB;
for i = 1:sizeim(1)
     for j = 1:sizeim(2)
if RGB(i,j,1) > 100 
        red_trace_x(a) = i;
        red_trace_y(b) = j;
        b = b+1;
    else
        maybe_red(i,j,:) = 1;
    end
end
a = a+1;
end

目前我将xy 存储在单独的数组中。但我想知道如何将两个 x,y 值存储在单个矩阵中。

谢谢!

【问题讨论】:

    标签: matlab


    【解决方案1】:

    下面生成一个掩码(一个与原图大小相同的逻辑数组),其中红色通道值大于100的像素存储为1,其他像素存储为0:

    img= imread('peppers.jpg');
    mask=img(:,:,1)>100;
    

    您可以使用掩码对原始图像进行索引,并使用find 对其进行更改以确定对应于值为 1 的掩码像素的线性索引:

    indlin=find(mask);
    img2 = img;
    

    您可以直接使用线性索引,例如使红色通道饱和:

    img2(indlin) = 255;
    

    或绿色通道:

    n = numel(img)/3;
    img2(indlin+n) = 255;
    

    从左到右,原始图像、蒙版、红色和绿色:

    编辑

    您可以使用

    从线性索引中检索数组下标ixiy
    [ix iy]=ind2sub(size(mask),indlin);
    

    【讨论】:

    • 如何从 indlin 中提取行 n 列??
    【解决方案2】:

    如果只存储元素的索引呢?

    %% Load a sample image
    RGB = imread('football.jpg'); 
    
    b = 1; 
    maybe_red = RGB;
    red = RGB(:,:,1); % Get the red component
    
    % i will represent the index of the matrix
    for i = 1:length(red(:))  % length(red(:)) = rows*cols
        if red(i) > 100 
            red_trace(b) = i;
            b = b+1;
        else
            [r,c] = ind2sub(size(red),i);  % Convert the index to rows and cols
            maybe_red(r,c,:) = 1;
        end
    end
    
    imshow(maybe_red);
    

    但这样做可能更容易

    red = RGB(:,:,1); % Get the red component of the image
    [r,c] = find(red>100);
    coord = [r c];
    

    【讨论】:

    • 根据上述分辨率,长度(红色)现在为 780。所以循环进行 780 次而不是 640*780 次..??但它必须遍历所有行 n col 来过滤所需的值。
    • 如果您的 rows=640 和 cols = 780,for i = 1:length(red) 将循环 640*780 次。您的代码循环遍历前两个维度。这是意图还是您打算遍历所有尺寸,即 640*780*n?第二种解决方案是首选,因为它会快很多。
    • 当我在 matlab 中尝试时,循环次数不超过 780 次。我完全按照你上面提到的那样做。但它仍然不起作用..我做错了什么..??
    • 对不起,我忘了在 length(red(:))) 中添加冒号运算符,但老实说,你不应该为此使用 for 循环,因为它非常慢。我的第二个建议是@Try Hard 答案的简短版本,这是正确的做法。它的速度要快得多...
    • 如果我想使用其他尺寸,仍然可以使用第二种方法吗??
    猜你喜欢
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多