Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 在图像中查找深紫色像素_Matlab_Image Processing_Pixel - Fatal编程技术网

Matlab 在图像中查找深紫色像素

Matlab 在图像中查找深紫色像素,matlab,image-processing,pixel,Matlab,Image Processing,Pixel,我正在为我在自动化方面的高等研究做一项研究。我已经完成了显微镜的自动化部分,但我需要MATLAB的帮助。我想细分的示例如下所示: 我需要从这张图像中提取深紫色像素,并只在图形中显示。这几乎类似于基于颜色的分割,但我只想从整个图像中提取深紫色像素 在这种情况下我该怎么办?这里有一些东西可以让你开始。让我们来谈谈颜色分割的主题,在这里你只想提取深紫色的像素。在我们开始之前,我想向您指出。HSV颜色空间是以人类最直观的方式表示颜色的理想选择。我们倾向于按照颜色的主导色来描述颜色,然后是诸如颜色的褪色

我正在为我在自动化方面的高等研究做一项研究。我已经完成了显微镜的自动化部分,但我需要MATLAB的帮助。我想细分的示例如下所示:

我需要从这张图像中提取深紫色像素,并只在图形中显示。这几乎类似于基于颜色的分割,但我只想从整个图像中提取深紫色像素


在这种情况下我该怎么办?

这里有一些东西可以让你开始。让我们来谈谈颜色分割的主题,在这里你只想提取深紫色的像素。在我们开始之前,我想向您指出。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