MATLAB圖像處理(一)——計算機圖形學之圖像形狀識別
由於遇到了很多次這個課題,這次做完之後結合手上的資料總結一下。
基本步驟:
1、讀取彩色圖像轉化爲二值圖像;
2、確定圖像中的形狀邊界;
3、確定所需形狀的目標;
本文主要通過識別圓形目標來進行說明,原圖如下所示,本例需要識別出下圖中的圓形物體:
1、讀取彩色圖像轉化爲二值圖像
針對圖像中可能有不同形狀的目標物體,爲了進行目標篩選,可以先通過形狀判斷,過濾掉我們不需要的物體,極大地提高圖像識別的效率。1) 讀取彩色圖像
% 1、讀取圖像並轉化爲二值圖像
RGB = imread('ImageSeg.png');
figure;imshow(RGB);title('原圖像');
2)將彩色圖像轉化爲二值圖像
% 轉化爲灰度圖像
I = rgb2gray(RGB);
% 設置閾值
threshold = graythresh(I);
% 轉化爲二值圖像
bw = im2bw(I,threshold);
注意:如果使用閾值公式進行轉化,轉化出的效果如果不符合預期的話需要手動調整閾值,上面代碼的效果如下:
所以我們根據圖像像素的特性人爲調整閾值。
bw = im2bw(I,0.69);
調整後的二值圖像如上圖所示,可以看到物體形狀非常清晰,但是明顯看到背景有許多噪點,所以在這裏爲了去除這些噪點我們進行了人工去噪,去噪的代碼如下,即簡單的領域判斷。
% 通過領域判斷手動去噪
[m,n] = size(bw);
for i = 2:m-1
for j = 2:n-1
%同上下元素判斷
if(bw(i,j)~=bw(i+1,j) && bw(i,j)~=bw(i-1,j))
bw(i,j) = 1;
%同左右元素判斷
elseif(bw(i,j)~=bw(i,j+1) && bw(i,j)~=bw(i,j-1))
bw(i,j) = 1;
%同斜邊元素判斷
elseif(bw(i,j)~=bw(i+1,j+1) && bw(i,j)~=bw(i-1,j-1))
bw(i,j) = 1;
%同斜邊元素判斷
elseif(bw(i,j)~=bw(i-1,j+1) && bw(i,j)~=bw(i+1,j-1))
bw(i,j) = 1;
end
end
end
去噪之後的二值圖像爲:
然後對以上圖像進行取反,以備下面使用。
for i = 1:m
for j = 1:n
bw(i,j) = ~bw(i,j);
end
end
結果爲
2、確定圖像中的形狀邊界
首先去除小目標,由於本例圖像中不存在小目標,所以可省略該步驟,其次進行孔洞填充並進行白色描邊,最後通過bwboundaries函數確定圖像邊界。
% 去除小目標,因爲本圖沒有小目標,所以可以不需要本條語句
bw = bwareaopen(bw,30);
% 圖形學結構元素構建,圓形
se = strel('disk',8);
% 關操作
bw = imclose(bw,se);
% 填充孔洞
bw = imfill(bw,'holes');
% 二值化圖像顯示
figure(1);imshow(bw);title('二值圖像');
[B,L] = bwboundaries(bw,'noholes');
figure(2);imshow(label2rgb(L,@jet,[.5 .5 .5]));
hold on;
for k = 1:length(B)
boundary = B{k};
% 顯示白色邊界
plot(boundary(:,2),boundary(:,1),'w','LineWidth',2)
end
3、確定所需形狀的目標
確定圓形目標,求取圖形周長,圓心,面積,人爲設置閾值進行過濾,在這裏我設置閾值爲0.85,即形狀比對大於這個閾值的就是我們所需要的目標物體。
hold on;
% 確定圓形目標
stats = regionprops(L,'Area','Centroid');
% 設置求面積
threshold = 0.85;
for k = 1:length(B)
boundary = B{k};
delta_sq = diff(boundary).^2;
% 求周長
perimeter = sum(sqrt(sum(delta_sq,2)));
% 求面積
area = stats(k).Area;
metric = 4*pi*area/perimeter^2;
metric_string = sprintf('%2.2f',metric);
% 根據閾值匹配
if metric > threshold
centroid = stats(k).Centroid;
plot(centroid(1),centroid(2),'ko');
text(centroid(1)-2,centroid(2)-2, '這是圓形','Color',...
'k','FontSize',14,'FontWeight','bold');
end
text(boundary(1,2)-10,boundary(1,1)-12, metric_string,'Color',...
'k','FontSize',14,'FontWeight','bold');
end
title('圖像形狀識別')
最後識別的效果圖爲:
源代碼及所使用的文件鏈接:https://download.csdn.net/download/yueyingguang/11381702