MATLAB圖像處理(一)——計算機圖形學之圖像形狀識別

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

發佈了35 篇原創文章 · 獲贊 13 · 訪問量 8534
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章