【问题标题】:Access RGB channels in an image in MATLAB在 MATLAB 中访问图像中的 RGB 通道
【发布时间】:2014-08-06 16:42:22
【问题描述】:

我想访问图像中每个像素的红色通道。我不想改变它。我只想识别具有红色范围的像素。我正在寻找具有 RGB(15,0,0)、RGB(120,0,0)、RGB(200,0,0) 等颜色的像素。我的图像大部分是灰色的,我想识别上面的红色框。

我试过了:

image = imread('myimage.jpg');
figure; imshow(image);

redPlane = image(:,:,1);
figure; imshow(redPlane);

显示的第二个图形全是灰色的。它脱掉了红色。

【问题讨论】:

  • 您正在访问红色组件,虽然它看起来是灰色的,但它具有红色组件的值。例如,如果您正在访问像素 (15,0,0),则您的第二张图像中的值将是 15。
  • 阅读this线程。
  • 你的意思是“我的图像大部分是灰色的”,你的原始图像大部分是灰色的,而它的某些部分是红色的?如果是这样,检查红色通道 only 可能无法识别红色框。因为“灰色”是具有相同或相似 RGB 值的东西。例如 RGB(120,120,120) 是灰色的,而在只选择红色通道的像素时不能排除它。最好区分灰色和红色。 en.wikipedia.org/wiki/…

标签: matlab image-processing rgb


【解决方案1】:

您将红色通道可视化为灰度图像。想想看。图像本质上是一个3D 矩阵。通过执行image(:,:,1);,您正在访问该图像的第一个切片,它是一个二维矩阵,对应于每个像素的红色分量。 imshow 函数使得如果输入是二维矩阵,则输出会自动显示为灰度。如果imshow 是一个 3D 矩阵,则输出会自动显示为彩色,其中矩阵的第一、第二和第三个切片分别对应于红色、绿色和蓝色分量。

因此,通过在这个二维矩阵上做imshow,它显然是灰度的。您只是错误地解释了结果。在这里,像素越白像素越红在图像的该位置。例如,假设您的图像是 uint8(无符号 8 位整数),如果某个特定位置的值是 255,这意味着该像素具有完全红色的分量,而如果您在特定位置的值为 0,这意味着没有红色组件。这将以黑白方式显示。

如果您想显示一个像素的红色程度,请将其放入一个 3D 矩阵中,其中第二个(绿色)和第三个(蓝色)通道都为零,同时您将红色通道设置为来自你的原始图像。换句话说,试试这个:

imageRed = uint8(zeros(size(image)));  %// Create blank image
imageRed(:,:,1) = redPlane; %// Set red channel accordingly
imshow(imageRed); %// Show this image

但是,如果您只想处理红色通道,则无需将其可视化。只需直接从矩阵本身中使用它。您说您想在图像中查找特定的红色通道值。忽略绿色和蓝色分量,你可以做这样的事情。假设我们要创建一个输出布尔地图locationMap,这样任何位置为真/ 1 将意味着这是一个位置具有您正在寻找的红色值,而假/ 0 意味着它不是。因此,请执行以下操作:

redPlane = image(:,:,1);
% // Place values of red you want to check here
redValuesToCheck = [15 20 100];

%// Initialize a boolean map where true
%// means this is a red value we're looking for and
%// false otherwise
locationMap = false(size(redPlane));

%// For each red value we want to check...
for val = redValuesToCheck
    %// Find those locations that share this
    %// value, and set to true on the boolean map
    locationMap(redPlane == val) = true;
end

%// Show the map
imshow(locationMap);

这里有一个你可能注意到也可能没有注意到的细微之处,但无论如何我都会提出来。 locationMap 是一个布尔变量,当您对此使用 imshow 时,true 会显示为白色,而 false 会显示为黑色。


小提示

使用image 作为变量名是一个非常糟糕的主意。 image 是 MATLAB 中已包含的预定义函数,它接收数字矩阵并将其可视化为图形。您应该改用其他东西,因为您可能有其他函数依赖于此函数,但您将无法运行它们,因为这些函数需要函数 image,但您已经用变量覆盖了它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    相关资源
    最近更新 更多