本博客主要記錄我利用Matlab學習圖像處理的一些學習筆記,歡迎交流,批評指正。
本篇是第一篇,主要講解圖像處理的一些基礎知識,列出如下:
1.二值化
2.開操作
3.連通區域提取
4.連通區域重心提取
5.bouding box提取
各操作背後的理論基礎,這裏先做簡要說明:
1.二值化:通過選取適當的閾值,將圖像上的像素點的灰度值設置爲0或255【黑(0)和白(255)】,使整個圖像呈現出黑白的效果。
圖像處理,第一步一般就是進行二值化,而二值化常用的方法有兩種(1)ostu方法,(2)Kittle算法。
一般先將圖像灰度化,再將灰度圖像二值化,然後進行其他處理。matlab可以直接用graythresh方法找到合適的閾值。之後用im2bw將灰度圖像轉化爲二值化圖像。
2.開操作:開操作一般應用在二值圖像分析處理的基礎上,使對象的輪廓變得光滑,斷開狹窄的間斷和消除細的突出物。
主要用來保留某種結構操作,remove其他不符合結構區域的前景區域像素。此操作依賴於結構元素的選取。
3.連通區域提取:在我們討論連通區首先要明確域算法之前,首先要知道什麼是連通區域。在圖像中,最小的單位是像素,每個像素周圍有8個鄰接像素。
常見的鄰接關係有兩種:4鄰接和8鄰接,4鄰接的一共有4個點,即上下左右,如下左圖所示,8鄰接的一共有8個點,包括了對角線,如下右圖所示。
如果像素A與B鄰接,那麼我們稱A與B連通,那麼有如下結論:
如果A與B連通,B與C連通,那麼A與C連通。
從視覺上來看,彼此連通的點形成了一個區域,而不連通的點形成了不同的區域,這樣一個所有彼此連通的點構成的集合,我們稱爲一個連通區域。
4.連通區域重心提取:只需要用matlab的regionprops方法就可很方便的獲取各種屬性。
5.bouding box提取:同樣用regionprops方法獲取。
源代碼如下:
%function:
%獲取圖像感興趣的位置,並進行標記
%date:2016-9-21
%author:Zyy
%清空變量,讀取圖像,並顯示其屬性
clear;close all
src = imread('rice.png');
whos
%顯示原始圖像
figure('name','myapp'),
subplot(2,2,1),imshow(src),title('src')
%用ostu方法獲取二值化閾值,進行二值化並進行顯示
level=graythresh(src);
bw=im2bw(src,level);
subplot(2,2,2),imshow(bw),title('bw')
%運用開操作消去噪點
se = strel('disk',2);%結構元素se
openbw=imopen(bw,se);
subplot(2,2,3),imshow(openbw),title('open')
%獲取連通區域,並進行顯示
L = bwlabel(openbw,4);
RGB = label2rgb(L);
subplot(2,2,4),imshow(RGB),title('rgb')
%獲取區域的'basic'屬性, 'Area', 'Centroid', and 'BoundingBox'
stats = regionprops(openbw, 'basic');
centroids = cat(1, stats.Centroid);
figure('name','regionprops'),
%繪製開操作之後的二值化圖像
imshow(openbw),title('centroids')
hold on
%繪製重心
plot(centroids(:,1), centroids(:,2), 'b*'),
%繪製感興趣區域ROI
for i=1:size(stats)
rectangle('Position',[stats(i).BoundingBox],'LineWidth',2,'LineStyle','--','EdgeColor','r'),
end
hold off