1. 不通過im2bw()函式完成影象二值化
通過graythreshold()函式,程式可以自動找到乙個對於當前來說更加合適的閾值來進行二值化。通過im2bw()影象,可以完成二值化,把當前影象變為只有黑白兩色的。例程如下:
i = imread('rice.png'); level=graythresh(i);
bw=im2bw(i, level); subplot(1,2,1); imshow(i);
subplot (1,2,2); imshow(bw);
結果:
如果不借助matlab中的函式,自己如何完成呢?
程式:
i = imread('rice.png');
thershold = 140;
for i=1:size(i,1)
for j= 1:size(i,2)
if i(i,j) > thershold
j(i,j) = 1;
else
j(i,j) = 0;
endend
endsubplot(1,2,1); imshow(i);
subplot(1,2,2); imshow(j);
結果:
可以看到兩種結果相差不大。但這張的下半部分背景色整體較深,導致一些「公尺粒」消失,可以通過「background estimation」的方法來得到背景,使得剩下的光線強度比較均勻,再通過「background subtraction」將背景分離,最後重新確定閾值並進行二值化。
程式:(在剛剛的基礎上繼續寫~)
i = imread('rice.png');
thershold = 140;
for i=1:size(i,1)
for j= 1:size(i,2)
if i(i,j) > thershold
j(i,j) = 1;
else
j(i,j) = 0;
endend
endsubplot(1,3,1); imshow(i);
subplot(1,3,2); imshow(j);
bg = imopen(i, strel('disk', 15)); %background estimation
i2 = imsubtract(i,bg); %background subtraction
level = graythresh(i2);
bw = im2bw(i2,level);
subplot(1,3,3); imshow(bw);
結果:
可以看到,經過處理後,原中的「公尺粒」和背景可以得到較好的分離。
**:
i=imread('rice.png');
bg=imopen(i, strel('disk', 15));
i2=imsubtract(i, bg); level=graythresh(i2);
bw=im2bw(i2, level);
[labeled, numobjects]=bwlabel(bw, 8);
flag=0;
num=;
for k=1:numobjects
for i= 1:size(labeled,1)
for j=1:size(labeled,2)
if labeled(i,j) == k;
flag=flag+1;
endend
endnum(end+1)=flag;
flag=0;
endmax(num);
int16(mean(num));
histogram(num); %下乙個練習中要求將size的histogram畫出
結果:
這兩個結果分別對應著max和mean的值。
其中,
i=imread('rice.png');
bg=imopen(i, strel('disk', 15));
i2=imsubtract(i, bg); level=graythresh(i2);
bw=im2bw(i2, level);
[labeled, numobjects]=bwlabel(bw, 8);
這部分**為老師給出的例程,通過這個程式可以得到乙個label matrix和numobjects, 直觀理解的話,分別為標註出的「公尺粒」和數出的公尺粒總數。從workspace中可以得到這個label matrix以及很直觀的公尺粒總數。
2. 將所有的公尺粒標為紅色
由於二值圖為單通道影象,而rgb三種顏色如果想要被呈現,必須是在影象為三通道的情況下才能實現。因此這一步,在剛才的基礎上,繼續對原圖進行一些處理。
**:
i=imread('rice.png');
bg=imopen(i, strel('disk', 15));
i2=imsubtract(i, bg); level=graythresh(i2);
bw=im2bw(i2, level);
[labeled, numobjects]=bwlabel(bw, 8);
flag=0;
num=;
for k=1:numobjects
for i= 1:size(labeled,1)
for j=1:size(labeled,2)
if labeled(i,j) == k
flag=flag+1;
endend
endnum(end+1)=flag;
flag=0;
endsubplot(1,2,1); imshow(labeled);
for i= 1:size(labeled,1)
for j=1:size(labeled,2)
if labeled(i,j) ~= 0
i(i,j,1)=255;
i(i,j,2)=0;
i(i,j,3)=0; %設定有公尺粒的地方為紅色,由於只顯示紅色,
%故只有第乙個通道值為255,其他均為0
else
i(i,j,1)=0;
i(i,j,2)=0;
i(i,j,3)=0; %背景色為黑色,三個通道均為0
endend
endsubplot(1,2,2); imshow(i);
結果:
MATLAB教程系列 台大 03 exercise
第三課中的練習,溫度轉換。要求,除非輸入的不是數字,程式停止,否則一直提示輸入溫度。function y ftoc f tips1 temperature in f is f input tips1 while isnumeric f 1 isempty f 0 isempty str2num f ...
Matlab系列教程 數值計算 求方差和標準差
首先,什麼是方差和標準差?方差,是在概率論和統計方差衡量隨機變數或一組資料時離散程度的度量,統計中的方差 樣本方差 是每個樣本值與全體樣本值的平均數之差的平方值的平均數。在許多實際問題中,研究方差即偏離程度有著重要意義。標準差,中文環境中又常稱均方差,是離均差平方的算術平均數的平方根。標準差是方差的...
Matlab系列教程之數值計算求方差和標準差
首先,什麼是方差和標準差?方差,是在概率論和統計方差衡量隨機變數或一組資料時離散程度的度量,統計中的方差 樣本方差 是每個樣本值與全體樣本值的平均數之差的平方值的平均數。在許多實際問題中,研究方差即偏離程度有著重要意義。標準差,中文環境中又常稱均方差,是離均差平方的算術平均數的平方根。標準差是方差的...