一天傍晚,在景观河散步,看到景观河旁边雕塑鸭子,就用手机拍摄下来,但由于是晚上光线不是太好,且雕塑下面的地板有条纹和阴影。想着尝试用传统的数字图像处理方法把鸭子从自然场景中提取出来。
读入低照度下图像,然后把鸭子从背景分割出来。算法主要步骤:1.读入彩色图像;2.图像裁剪;3.彩色图像转灰度图像;4.对比度拉伸;5.图像二值化;6.数学形态学运算处理后的二值图像;7.边缘检测图像;8.边缘检测和阈值分割相结合进行目标分割;9.边缘检测和阈值分割相结合进行目标分割。结果显示,上述方法取得了较好的分割效果。
close all;% 关闭所有的图像窗口
clc;% 清除当前command区域的命令
imtool close all;%关闭imtool窗口
I0 = imread('duck1.jpg');
I = imcrop(I0,[190 170 1400 1000]);%图像裁剪
I2=rgb2gray(I);
figure,imshow(I2);
figure,imhist(I2);
I2Adjust=imadjust(I2); %对比度拉伸
figure,imshow(I2Adjust);
figure,imhist(I2Adjust);
imtool(I2Adjust);
I3=im2bw(I2Adjust,100/255); %图像二值化,阈值选择很关键
figure,imshow(I3);
I_4=~I3;
figure,imshow(I_4);
I_4=imfill(I_4,'holes');figure,imshow(I_4);
figure,imshow(I_4);
I_5=imclose(I_4,strel('disk',4)); %利用开运算连接物体,结构元素的形状和大小选择很关键
figure,imshow(I_5);
I_5=imopen(I_5,strel('disk',2));
figure,imshow(I_5);
I_6=bwareaopen(I_5,2100);
figure,imshow(I_6);
I_8=edge(I2,'sobel','vertical');%边缘检测,把原始图像中的水平线去掉
%I_8=edge(I2,'sobel');
figure,imshow(I_8);
I_9=I_6+I_8;
figure,imshow(I_9);%利用边缘检测和阈值分割相结合进行目标分割
I_10=imclose(I_9,strel('disk',9));
figure,imshow(I_10);
I_11=bwareaopen(I_10,500);
figure,imshow(I_11);
I_12=imfill(I_11,'holes');
figure,imshow(I_12);
I_13=imclose(I_12,strel('disk',18));
figure,imshow(I_13);
I_14=imfill(I_13,'holes');
figure,imshow(I_14);
I_15=imopen(I_14,strel('disk',10));
figure,imshow(I_15);
I_16=uint8(I_15).*I;
figure,imshow(I_16),title('将鸭子从背景分割中分割出来');
[L,num] = bwlabel(I_15);
disp('鸭子的数量')
num
figure('Name','低照度环境下的图像背景分割一种新方法','NumberTitle','off');
subplot(3,3,1),imshow(I0),title('显示原始图像');
subplot(3,3,2),imshow(I),title('图像裁剪');
subplot(3,3,3),imshow(I2),title('彩色图像转灰度图像');
subplot(3,3,4),imshow(I2Adjust),title('对比度拉伸');
subplot(3,3,5),imshow(I3),title('图像二值化');
subplot(3,3,6),imshow(I_6),title('数学形态学运算处理后的二值图像');
subplot(3,3,7),imshow(I_8),title('边缘检测图像');
subplot(3,3,8),imshow(I_9),title('边缘检测和阈值分割相结合进行目标分割');
subplot(3,3,9),imshow(I_15),title('边缘检测和阈值分割相结合进行目标分割');
%程序在MATLAB 2018a 调试通过
原始图像如下:
欢迎各位网友对上面算法的不足之处提出改进意见,谢谢大家!