我想访问图片中每个像素的红色通道。我不想改变它。我只是想识别一系列红色的像素。我正在寻找具有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);
显示的第二个数字全部为灰色。它脱掉了红色。
答案 0 :(得分:10)
您将红色通道可视化为灰度图像。想一想。图像本质上是 3D矩阵。通过执行image(:,:,1);
,您正在访问该图像的第一个切片,这是一个2D矩阵,这对应于每个像素的红色分量。 imshow
函数使得如果输入是2D矩阵,则输出自动可视化为灰度。如果imshow
是3D矩阵,则输出会自动以彩色显示,其中矩阵的第一,第二和第三个切片分别对应于红色,绿色和蓝色组件。
因此,通过对此2D矩阵执行imshow
,它显然是灰度的。你只是错误地解释了结果。这里,像素越白,像素越红,就在图像的那个位置。例如,假设您的图像为uint8
(无符号8位整数),如果某个值在特定位置具有255,则表示该像素具有完全红色的成分,而如果您在某个特定位置具有值0 location,这意味着没有红色组件。这将以黑白显示。
如果要显示像素的红色,请将其放入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
,但是你已经用变量将它遮蔽了代替。