在MATLAB中访问图像中的RGB通道

ine*_*adl 2 rgb matlab image-processing

我想访问图像中每个像素的红色通道.我不想改变它.我只是想识别一系列红色的像素.我正在寻找具有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);
Run Code Online (Sandbox Code Playgroud)

显示的第二个数字全是灰色的.它脱掉了红色.

ray*_*ica 10

您将红色通道可视化为灰度图像.想一想.图像本质上是3D矩阵.通过这样做image(:,:,1);,您正在访问图像的第一个切片,这是一个2D矩阵,这对应于每个像素的红色分量. imshow如果输入是2D矩阵,则输出自动可视化为灰度.如果imshow是3D矩阵,则输出自动以彩色显示,其中矩阵的第一,第二和第三切片分别对应于红色,绿色和蓝色分量.

因此,通过imshow对这个2D矩阵进行操作,它显然是灰度级的.你只是错误地解释了结果.这里,像素白,像素在图像的该位置越红.例如,假设您的图像是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
Run Code Online (Sandbox Code Playgroud)

但是,如果您只想处理红色通道,则无需将其可视化.只需直接从矩阵本身使用它.您说您想在图像中查找特定的红色通道值.忽略绿色和蓝色组件,你可以做这样的事情.假设我们想要创建一个输出布尔映射locationMap,使得任何位置为true/1将意味着这是一个位置具有您正在寻找的红色值,而false/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);
Run Code Online (Sandbox Code Playgroud)

这里有一个小小的微妙之处,你可能会或可能不会注意到,但无论如何我都会提出来. locationMap是一个布尔变量,当你使用imshow它时,true可视化为白色而false则可视化为黑色.


小调

使用image变量名是一个非常糟糕的主意. image是一个已经包含在MATLAB中的预定义函数,它接收一个数字矩阵并在图中显示它.你应该使用别的东西,因为你可能有其他依赖于这个函数的函数,但你不能运行它们,因为函数期望函数image,但你已经用变量遮住了它.