不经历风雨,怎么见彩虹!2024年6月14日下午一场及时雨,不仅消除了暑热,也带来了美丽彩虹,就想着尝试把空中的彩虹从自然场景中提取出来,希望对学习图像的有所帮助。
读入自然场景下雨后彩虹图像,然后对彩虹从背景分割出来。算法思想:通过提取红、绿和蓝各分量图像和RGB转灰度后的灰度图像,通过直方图分析发现其双峰特性不明显。使用improfile绘制图像穿过背景和彩虹的R、G 、B分量的灰度值曲线,再结合imtool图像分析工具箱,发现采用R-B彩色分割因子转化为灰度图像效果较好。然后再对Irb图像进行二值化,区域标记和数学形态学处理,最后进行处理过程和结果显示。
详细代码如下:
clear all;close all;clc;
imtool close all;
I=imread('.\Rainbow_20240614.jpg');%读入雨后彩图像
imshow(I);
[M,N,D]=size(I);%测试图像的行列数和通道数
whos;
imtool(I);
Ir=I(:,:,1);
figure,imshow(Ir);
Ig=I(:,:,2);
figure,imshow(Ig)
Ib=I(:,:,3);figure,imshow(Ib)
Igray=rgb2gray(I);
figure,imhist(Igray),title('rgb2gray(I)后的灰度直方图');
x=[1 1279]
y=[450 450]
improfile(I,x,y);
Irb=Ir-Ib;
figure,imhist(Irb);
imtool(Irb);
bw=im2bw(Irb,10/255); %通过imtool和improfile进行分析确定阈值
figure,imshow(bw);
bw2=bwareaopen(bw,16000);
figure,imshow(bw2);
[L,num]=bwlabel(bw2);%对二值图像进行标记
num
obj=bwareafilt(bw,[16000 18000]);%对指定面积范围的目标进行提取
se = strel('disk',17); %选择合适的结构元素形式和尺寸,感兴趣的可以尝试使用线性或菱形结构元素
obj2 = imopen(obj,se);%使用数学形态学开运算
figure,imshow(obj2);
Rainbow=uint8(obj2).*I;
figure('Name','自然场景下彩虹提取','NumberTitle','off');
subplot(2,3,1),imshow(I),title('原始图像');
subplot(2,3,2),imshow(Irb),title('R-B图像');
subplot(2,3,3),imshow(bw),title('二值图像');
subplot(2,3,4),imshow(obj),title('对指定面积范围的目标进行提取');
subplot(2,3,5),imshow(obj2),title('彩虹二值图像模版');
subplot(2,3,6),imshow(Rainbow),title('提取的彩虹图像');
%本程序在MATLAB 2018b环境下通过调试
程序运行结果如图所示:
雨后彩虹原始图像: