基于MATLAB圖像處理技術(shù)之輪廓提取
1.迭代閾值處理和平滑濾波法處理方式
- 處理思路:
1.讀入圖片: I=imread('1.jpg');
2.二值化處理: I1 = rgb2gray(I);
3.閾值處理:選用的迭代法,當(dāng)然閾值處理需要選用合適才能成功优炬。
4.濾波降噪:采用平滑濾波
5.邊緣檢測(cè):
感覺(jué)canny和log比較好颁井,這個(gè)可根據(jù)所選的測(cè)試材料的性質(zhì)來(lái)確定。
6.最大連通域法截取最大的輪廓:
- 如果中間濾波處理的不是很完善蠢护,或者外界干擾性差蚤蔓,會(huì)引起所選輪廓缺失。除此之外就是圖像自身因素糊余。
話不多說(shuō)秀又,直接上代碼
I=imread('1.jpg'); %讀取圖片
I1 = rgb2gray(I); %二值化處理:0/1
ZMAX=max(max(I1)); %取出最大灰度值
ZMIN=min(min(I1)); %取出最小灰度值
TK=(ZMAX+ZMIN)/2; %獲得平均灰度值
%迭代閾值處理
bcal=1; %定義變量
ISIZE=size(I1); %讀出圖像大小
while(bcal)
iForeground=0; %定義前景和背景數(shù)
iBackground=0;
ForegroundSum=0; %定義前景和背景灰度總和
BackgroundSum=0;
for i=1:ISIZE(1)
for j=1:ISIZE(2)
tmp=I1(i,j);
if(tmp>=TK)
iForeground=iForeground+1;
ForegroundSum=ForegroundSum+double(tmp); %前景灰度值
else
iBackground=iBackground+1;
BackgroundSum=BackgroundSum+double(tmp);
end
end
end
ZO=ForegroundSum/iForeground; %計(jì)算前景和背景的平均值
ZB=BackgroundSum/iBackground;
TKTmp=uint8(ZO+ZB)/2;
if(TKTmp==TK )
bcal=0;
else
TK=TKTmp;
end %當(dāng)閾值不再變化的時(shí)候,說(shuō)明迭代結(jié)束
end
disp(strcat('迭代后的閥值:',num2str(double(TK))));
newI=im2bw(I,double(TK)/255);
subplot(1,2,1);imshow(I1);
xlabel('(a)原始圖像');
subplot(1,2,2);imshow(newI);
xlabel('(b)迭代法分割效果圖');
%采用平滑濾波降噪
J2=filter2(fspecial('average',5),newI)/255;
imshow(newI,[]);
title('平滑濾波后圖像');
bw=imfill(newI,'hole'); %填充噪點(diǎn)輪廓
isuo=imresize(bw,0.25,'bicubic');
ecanny=edge(isuo,'canny'); %canny算子檢測(cè)
figure,imshow(ecanny),title('邊緣檢測(cè)圖像');
if length(size(ecanny))>2
end
f=bwareaopen(ecanny,50);
figure,imshow(f),title('雜點(diǎn)消除');
%二次二值化處理
if ~islogical(f)
imBw = im2bw(f); %轉(zhuǎn)換為二值化圖像
else
imBw =f;
end
imBw = im2bw(f); %轉(zhuǎn)換為二值化圖像
%使用最大連通域法進(jìn)行最后的分割---輪廓提取
imLabel = bwlabel(imBw); %對(duì)各連通域進(jìn)行標(biāo)記
stats = regionprops(imLabel,'Area'); %求各連通域的大小
area = cat(1,stats.Area);
index = find(area == max(area)); %求最大連通域的索引
img = ismember(imLabel,index);
figure,imshow(img),title('檢測(cè)圖像');
基于快速傅里葉變換法之圖像處理
- 1.這里采用的是傅里葉變換技術(shù)贬芥,在噪點(diǎn)消除上有明顯的不同吐辙,其次就是在雜點(diǎn)去除過(guò)程中有明顯的差別。這樣更有利于圖像全部像素點(diǎn)的采集處理蘸劈。
- 2.由于傅里葉變換需要將每個(gè)像素點(diǎn)都要一次一次的計(jì)算昏苏,使得程序運(yùn)行起來(lái)相對(duì)吃力一點(diǎn)。所以后期的優(yōu)化工作需要采用其他更高效的辦法進(jìn)行測(cè)試比較威沫。
ims=imread('0.jpg');
im=rgb2gray(ims);
d0=50; %閾值
img_noise=imnoise(im,'salt'); % 加椒鹽噪聲
%選取一種噪聲贤惯,便于后續(xù)操作
%img_noise=imnoise(img_origin,'gaussian'); % 加高斯噪聲
img_f=fftshift(fft2(double(img_noise))); %傅里葉變換得到頻譜
[m n]=size(img_f);
m_mid=fix(m/2); %選取一種取整方式,這里選的比較簡(jiǎn)單
n_mid=fix(n/2);
img_lpf=zeros(m,n);
for i=1:m
for j=1:n
d=sqrt((i-m_mid)^2+(j-n_mid)^2); %理想低通濾波棒掠,求距離
if d<=d0
h(i,j)=1;
else
h(i,j)=0;
end
img_lpf(i,j)=h(i,j)*img_f(i,j);
end
end
img_lpf=ifftshift(img_lpf); %反傅里葉變換
img_lpf=uint8(real(ifft2(img_lpf))); %取實(shí)數(shù)部分
subplot(2,2,1);imshow(img_origin);title('原圖');
subplot(2,2,2);imshow(img_noise);title('噪聲圖');
subplot(2,2,3);imshow(img_lpf);title('理想低通濾波');
[thr,sorh,keepapp]=ddencmp('den','wv',img_lpf);
ixc=wdencmp('gbl',img_lpf,'sym4',2,thr,sorh,keepapp);
figure,imshow(ixc),title('消噪后圖像 ');
isuo=imresize(ixc,0.25,'bicubic');
g=imdilate(isuo,strel('disk',2));
figure,imshow(g),title('增強(qiáng)圖像');
ecanny=edge(g,'canny');
figure,imshow(ecanny),title('邊緣檢測(cè)圖像');
if length(size(ecanny))>2
end
f=bwareaopen(ecanny,50);
figure,imshow(f),title('雜點(diǎn)消除');
if ~islogical(f)
imBw = im2bw(f); %轉(zhuǎn)換為二值化圖像
else
imBw =f;
end
imBw = im2bw(f); %轉(zhuǎn)換為二值化圖像
imLabel = bwlabel(imBw); %對(duì)各連通域進(jìn)行標(biāo)記
stats = regionprops(imLabel,'Area'); %求各連通域的大小
area = cat(1,stats.Area);
index = find(area == max(area)); %求最大連通域的索引
img = ismember(imLabel,index);
figure,imshow(img),title('檢測(cè)圖像');
總結(jié):
1.學(xué)習(xí)過(guò)程中需要多思考多總結(jié)孵构。
2.后期優(yōu)化處理需要做到更切合實(shí)際場(chǎng)景,敢于嘗試失敗烟很。