苹果花的提取采用图像处理与背景分割技术,首先批处理读取图片,提取彩色图像的RGB三个通道。在图片中心位置(即所需提取的苹果花所在位置)取一中心横线,表示出三通道的具体变化趋势与大小,通过判定两条相距最远的通道曲线,利用三通道相减得出效果最好的通道图。利用线性运算提高通道图的亮度。根据通道图的直方图,选取最佳阈值对图片进行二值化处理。鉴于所提取目标呈现白色,故对图片进行取反。又图片取自自然场景,噪声区域面积较大,故先对图片进行均值滤波处理,再利用bwareaopen函数,去除二值图像中的噪音区域。最后将图像的每个像素值乘以对应的颜色通道(红、绿、蓝),然后将结果合并为一个新的图像,即为提取图像。
1.彩色图像三通道提取
Ir=I(:,:,1);% 提取图像的红色通道,并将其存储在变量Ir中
Ig=I(:,:,2);% 提取图像的绿色通道,并将其存储在变量Ig中
Ib=I(:,:,3);% 提取图像的蓝色通道,并将其存储在变量Ib中
2.获取三通道对比图
[i,j]=size(I); % 获取图像的大小(高度和宽度)
figure,imtool(I)
line1=I(1,:);% 提取图像的第一行作为线条1的数据
line2=I(2,:);% 提取图像的第二行作为线条2的数据
line3=I(3,:);% 提取图像的第三行作为线条3的数据
hold on % 保持当前图形的绘制状态
plot(line1,'r');% 在当前图形中绘制线条1,颜色为红色
plot(line2,'g');
plot(line3,'b');
hold off % 关闭当前图形的绘制状态
figure('name','绘制彩色图像横穿第i/2行的rgb通道的灰度值');
% 确保提取的行和列的范围在图像的大小范围内
i1= min(max(i/2,1),i);
j1= min(max(j/2,1),j);
i2=floor(i1);%小数取其整数部分
j2=floor(j1);
k=min(i,j);
line4=I(i2,1:k,1);%提取图像的第i行,从第1列到第j列,作为线条4的数据
line5=I(i2,1:k,2);
line6=I(i2,1:k,3);
plot(line4,'r');
hold on;
plot(line5,'g');
hold on;
plot(line6,'b');
hold on;
3.获取效果最好的通道图
figure,
%Irg=Ir-Ig;
%Irb=Ir-Ib;
Igb=3*Ig-Ib;
figure,imshow(Igb);
figure,imhist(Igb);
4.阈值分割(二值化)
bw=im2bw(Igb,110/255);
figure,imshow(bw);
5.二值图像取反
bw=imcomplement(bw);
6.均值滤波
% 设置均值滤波
H3 = fspecial('average',[3,3]);
H5 = fspecial('average',[5,5]);
H7 = fspecial('average',[7,7]);
H9 = fspecial('average',[9,9]);
% 利用滤波对图像进行处理
r3 = imfilter(bw,H3);
r5 = imfilter(bw,H5);
r7 = imfilter(bw,H7);
r9 = imfilter(bw,H9);
% 展示结果
subplot(2,3,1);imshow(bw);title('原图');
subplot(2,3,2);imshow(r3);title('3*3均值滤波结果');
subplot(2,3,3);imshow(r5);title('5*5均值滤波结果');
subplot(2,3,4);imshow(r7);title('7*7均值滤波结果');
subplot(2,3,5);imshow(r9);title('9*9均值滤波结果');
7.结果处理
bw=bwareaopen(r3,80000);
%bw=im2bw(Igb,graythresh(Igb));
%figure,imshow(bw);
%bw=imcomplement(bw);
objm=uint8(bw).*Ir;
objn=uint8(bw).*Ig;
objl=uint8(bw).*Ib;
obj=cat(3,objm,objn,objl);
figure,imshow(obj);
注:GUI界面代码会在后续文章中给予参考