Matlab 在图像中查找深紫色像素
我正在为我在自动化方面的高等研究做一项研究。我已经完成了显微镜的自动化部分,但我需要MATLAB的帮助。我想细分的示例如下所示: 我需要从这张图像中提取深紫色像素,并只在图形中显示。这几乎类似于基于颜色的分割,但我只想从整个图像中提取深紫色像素Matlab 在图像中查找深紫色像素,matlab,image-processing,pixel,Matlab,Image Processing,Pixel,我正在为我在自动化方面的高等研究做一项研究。我已经完成了显微镜的自动化部分,但我需要MATLAB的帮助。我想细分的示例如下所示: 我需要从这张图像中提取深紫色像素,并只在图形中显示。这几乎类似于基于颜色的分割,但我只想从整个图像中提取深紫色像素 在这种情况下我该怎么办?这里有一些东西可以让你开始。让我们来谈谈颜色分割的主题,在这里你只想提取深紫色的像素。在我们开始之前,我想向您指出。HSV颜色空间是以人类最直观的方式表示颜色的理想选择。我们倾向于按照颜色的主导色来描述颜色,然后是诸如颜色的褪色
在这种情况下我该怎么办?这里有一些东西可以让你开始。让我们来谈谈颜色分割的主题,在这里你只想提取深紫色的像素。在我们开始之前,我想向您指出。HSV颜色空间是以人类最直观的方式表示颜色的理想选择。我们倾向于按照颜色的主导色来描述颜色,然后是诸如颜色的褪色程度、纯度以及颜色的明暗程度等属性。主色由色调表示,颜色的褪色程度或纯度由饱和度表示,颜色的强度由值表示,因此,Hue-S饱和-V值或HSV颜色空间 我们可以将RGB图像变换为HSV。这将返回一个3D矩阵,其色调、饱和度和值作为3D矩阵中的2D切片,非常类似于RGB图像,其中每个切片表示红色、绿色和蓝色通道。让我们看看将图像转换为HSV后每个组件的外观:
im = imread('https://www.cdc.gov/dpdx/images/malaria/ovale/Po_gametocyte_thickB.jpg');
hsv = rgb2hsv(im2double(im));
figure;
for idx = 1 : 3
subplot(1,3,idx);
imshow(hsv(:,:,idx));
end
第一行代码从URL读入图像。我将使用Hoki提到的那个,因为它是最简单的一个。对于自我包容,这是原始图像的外观:
一旦我们这样做,我们将图像转换为HSV颜色空间。将图像转换为双精度
并将每个组件规格化为[0,1]
,这一点很重要,由执行。接下来,我们生成一个新图形,并将每个组件放在三列上的一行中。第一列表示色调,下一列表示饱和度,最后一列表示值。这是我们看到的数字:
第一幅图的主色调似乎是紫色,无论是浅色调还是深色调,所以色调在这里对我们没有帮助。如果您查看HSV彩色车轮:
(来源:) 正常化车轮,使其位于
[0,1]
之间,而不是0到360度之间。由于颜色空间的性质,色调实际上表示为度,但MATLAB将其标准化为[0,1]
。您可以看到紫色的色调为[0.6,0.8]
,这与我向您展示的第一个显示图像色调的图形相对应。如果检查图像周围的像素,它们会在该范围内波动。因此,色调在这里对我们帮助不大
当然,饱和度和价值成分对我们有帮助。如果你看一看,深紫色像素比背景的其他部分有更高的饱和度,这是有道理的,因为深紫色比背景的其他部分有更纯的紫色版本。对于该值,可以看到深紫色的亮度比背景暗
我们可以利用这两点来分割图像中的紫色。最简单的方法是设置饱和度和值平面的阈值,以便保留某个范围内的任何值,而将该范围外的值丢弃。因此,您可以这样做:
sThresh = hsv(:,:,2) > 0.6 & hsv(:,:,2) < 0.9;
vThresh = hsv(:,:,3) > 0.4 & hsv(:,:,3) < 0.65;
我们也将展示结果。这就是我们得到的:
正如你所看到的,这做得很好,但我们有红色箭头的残余,我们不希望在最终结果中。为了做一些清理,我们可以使用形态学——特别是一个小窗口的开放过滤器,这样我们就不会影响我们想要的像素。我们可以使用来为我们执行开放操作。形态学开口可移除图像周围出现的孤立像素。你用一种叫做a的东西来观察你图像中的当地居民区。基本上,与结构元素中包含的形状一样小的任何像素区域都会被删除。由于我们希望保留其他对象的形状,因此可以尝试使用5 x 5的磁盘结构元素来清理这些像素:
figure;
se = strel('disk', 2, 0);
final = imopen(result, se);
imshow(final);
这就是我们得到的:
不错!我们需要修补一些漏洞,所以让我们用以下内容来填补这些漏洞:
这就是我们得到的:
好的!所以我们有了面具。我们需要做的最后一件事是呈现图像,以便您只显示原始图像中的深紫色,而不显示其他颜色。这可以通过以下方式轻松实现:
上面的操作获取您的遮罩,并将图像中的每个像素乘以此遮罩。我想指出的一点是,我们在上一步中找到的掩码需要转换为uint8
,因为bsxfun
要求乘法(或您执行的任何操作)必须是相同类型的。我们在3D中复制这个遮罩,这样你就可以遮罩掉不需要的RGB像素,只保留你要找的像素
这就是我们最终得到的:
正如你所看到的,它并不完美,但肯定足以让你开始。这些阈值很重要,但通过一些非常简单的阈值处理,我提取了大部分紫色像素
为了让您更轻松,下面是我上面编写的代码,可以轻松复制并粘贴到MATLAB中供您运行:
clear all; close all; clc;
im = imread('https://www.cdc.gov/dpdx/images/malaria/ovale/Po_gametocyte_thickB.jpg');
hsv = rgb2hsv(im2double(im));
figure;
for idx = 1 : 3
subplot(1,3,idx);
imshow(hsv(:,:,idx));
end
sThresh = hsv(:,:,2) > 0.6 & hsv(:,:,2) < 0.9;
vThresh = hsv(:,:,3) > 0.4 & hsv(:,:,3) < 0.65;
figure;
result = sThresh | vThresh;
imshow(result);
figure;
se = strel('disk', 2, 0);
final = imopen(result, se);
imshow(final);
figure;
final_noholes = imfill(final, 'holes');
imshow(final_noholes);
figure;
out = bsxfun(@times, im, uint8(final_noholes));
imshow(out);
全部清除;全部关闭;clc;
im=imread('https://www.cdc.gov/dpdx/images/malaria/ovale/Po_gametocyte_thickB.jpg');
figure;
final_noholes = imfill(final, 'holes');
imshow(final_noholes);
figure;
out = bsxfun(@times, im, uint8(final_noholes));
imshow(out);
clear all; close all; clc;
im = imread('https://www.cdc.gov/dpdx/images/malaria/ovale/Po_gametocyte_thickB.jpg');
hsv = rgb2hsv(im2double(im));
figure;
for idx = 1 : 3
subplot(1,3,idx);
imshow(hsv(:,:,idx));
end
sThresh = hsv(:,:,2) > 0.6 & hsv(:,:,2) < 0.9;
vThresh = hsv(:,:,3) > 0.4 & hsv(:,:,3) < 0.65;
figure;
result = sThresh | vThresh;
imshow(result);
figure;
se = strel('disk', 2, 0);
final = imopen(result, se);
imshow(final);
figure;
final_noholes = imfill(final, 'holes');
imshow(final_noholes);
figure;
out = bsxfun(@times, im, uint8(final_noholes));
imshow(out);
function main
clc,clear
A = imread('https://www.cdc.gov/dpdx/images/malaria/ovale/Po_gametocyte_thickB.jpg');
subplot(1,2,1)
imshow(A)
RGB = [230 210 200]; % color you want
e = 40; % color shift
B = pix_in(A,RGB,e);
B = B + 255.*uint8(~B); % choosing white background
subplot(1,2,2)
imshow(B)
end
function B = pix_in(A,RGB,e)
% select specific pixels in image
% A - color image (3D matrix uint8)
% RGB - [R G B] - color to select
% e - color shift/deviation
A = double(A); % for same class operations (RGB - double)
[m, n, ~] = size(A);
RGB = reshape(RGB,1,1,3);
RGB = repmat(RGB,m,n,1); % creating 3D matrix
b = abs(A-RGB) < e; % logical 3D
b = sum(b,3) == 3; % if [R,G,B] of a pixel in range
B = A.*repmat(b,1,1,3); % selecting pixels those in range
B = uint8(B);
end