matlab轮廓提取做掩膜,分享一下 自己做的由彩色图像到轮廓提取

这是一段自己写的由彩色图像到轮廓提取的代码,或者说背景去除也可以,也是在这里向别人学习过的,拿来看一下,注释中既有解释也有问题,欢迎大家多提建议

clc; clear all; close all;

img = imread('c:\\ce11_yasuo.jpg');

subplot(331)

imshow(img);

title('原始图像')

%*%RGB到HSV空间的变换

hsv = rgb2hsv(img);

%**%提取HSV空间的h参数图像,到底选择哪个参数的图像现在还不太知道原因

%**%s参数这里也可以,但那只是试的结果

%参数选择的不同,下面bwareaopen imfill两个函数用的时候要注意

h = hsv(:,:,1);%h参数提取出来的图像果穗为黑色,背景亮

% s=hsv(:,:,2);%s参数提取出来的图像果穗为亮色,背景黑色

subplot(332)

imshow(h);

title('h参数图像')

%进行直方图均衡化效果非常不好

% % figure

% % subplot(121)

% % imshow(s)

% % s=histeq(s);

% % subplot(122)

% % imshow(s)

%***%

bw = ~im2bw(h,graythresh(h));% 二值化,边缘提取

%%上面二值化阈值的选择也是一个需要说明的问题

subplot(333)

imshow(bw);

title('二值化图像')

%****%选取图片像素大小的0.01做为bwareaopen函数填充的阈值

m=round(size(img,1)*size(img,2)*0.01)%round函数是寻找最接近结果的整数

bw_open = bwareaopen(bw,m);% 去除杂物,去除的是白色的小洞,将小于一定面积的白色小洞甜味黑色

%%%%%%%刚开始阈值设为1000时,底部刻度噪声存在,现在改成6000,阈值大点就好了

%%%%%%%%关于这个阈值如何设定,可以统计一般的果穗所占图片的大小比例

%%%%%%%%阈值的选择是通过试验得出来的  下面(1)(2)(3)

subplot(334)

imshow(bw_open);

title('去杂图像')

%*****% 填上空洞,保证空洞中填满白色

bw_fill = imfill(bw_open,'holes');

% % imwrite(bw_fill, 'c:\\mask.jpg');

subplot(335)

imshow(bw_fill);

title('填充图像')

%%%%(1)

% sum_cornarea=sum(sum(bw_fill));%%%%用来计算玉米区域一共有多少个像素点

%******% 得到空洞边界曲线 该函数就是检测二值图像的边缘

perim=bwperim(bw_fill);

subplot(336)

imshow(perim);

title('轮廓图像')

%*******%统计轮廓有多少个亮点, 用于标记各个亮点

sum_cornedge=sum(sum(perim));

if ndims(img) == 3%判断源图像是几维的图像  ndims(a)表示矩阵a的维数

d1 = repmat(bw_fill(:), 1, 3); % 得到mask模板,用来提取玉米果穗,去掉背景

%    d1=~d1;%这里将d1翻转,模板就变成获得背景的模板,去掉果穗

d1 = reshape(d1, size(img, 1), size(img, 2), 3); % 将模板对应到图片

end

d2 = uint8(d1).*img;

subplot(337)

imshow(d2);

title('去掉背景')

%%%%(2)

% sum_allpic=size(img, 1)*size(img, 2);%%%%%整张图片的大小

%%%%(3)

% sum_proption=(sum_cornarea/sum_allpic)*100;%%%%%玉米区域所占整张图片的比例,据此可以设定去除杂物

% 时的阈值