这是一段自己写的由彩色图像到轮廓提取的代码,或者说背景去除也可以,也是在这里向别人学习过的,拿来看一下,注释中既有解释也有问题,欢迎大家多提建议
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;%%%%%玉米区域所占整张图片的比例,据此可以设定去除杂物
% 时的阈值