當前位置:首頁 » 操作系統 » canny演算法matlab

canny演算法matlab

發布時間: 2023-03-24 04:24:16

Ⅰ matlab二值圖像截取

可以使用bwperim()函數進行輪廓提取,具體代碼如下:

%讀取原圖
im = imread( filepath );
imshow(im);
title('原圖');

% 轉二值圖像
bw = im2bw( im );

%輪廓提取
contour = bwperim(bw);
figure
imshow(contour);
title('輪廓')

原圖和所提取的模旁渣輪廓分別如圖1和圖2所示。

圖6canny運算元、Laplacian運算元檢測結果

3.邊緣檢測結果比較

Roberts運算元檢測方法對具有陡峭的低雜訊的圖像處理效果較好,但是利用roberts運算元提取邊緣的結果是邊緣比較粗,因此邊緣的定位不是很准確。

Sobel運算元檢測方法對灰度漸變和雜訊較多的圖像處理效果較好,sobel運算元對邊緣定位不是很准確,圖像的邊緣不止一個像素。

Prewitt運算元檢測方法對灰度漸變和雜訊較多的圖像處理效果較好。但邊緣較寬,而且間斷點多。

Laplacian運算元法對雜訊比較敏感,所以很少用該運算元檢測邊緣,而是用來判斷邊緣像素視為與圖像的明區還是暗區。

Canny方法不容易受雜訊干擾,能夠檢測到真正的弱邊緣。優點在於,使用兩種不同的閾值分別檢測強邊緣和弱邊緣,並且當弱邊緣和強邊緣相連時,才將弱邊緣包含在輸出圖像中。

參考文獻

[1]趙春暉.現代圖像處理技術及Matlab實現[M].北京:人民郵電出版社,2001.

[2]阮秋琦.數字圖像處理學[M].北京:電子工業出版社,2001.

[3]何斌.數字圖像處理[M].北京:人民郵電出版社,2001

I=imread('lena.bmp');%提取圖像

BW1=edge(I,'sobel');%用SOBEL運算元進行邊緣檢測

BW2=edge(I,'roberts');%用Roberts運算元進行邊緣檢測

BW3=edge(I,'prewitt');%用prewitt運算元進行邊緣檢測

BW4=edge(I,'log');%用log運算元進行邊緣檢測

BW5=edge(I,'canny');%用canny運算元進行邊緣檢測

h=fspecial('gaussian』,5);

BW6=edge(I,』canny』);

subplot(2,3,1),imshow(BW1);

title(『sobeledgecheck』);

subplot(2,3,2),imshow(BW2);

title(『sobeledgecheck』);

subplot(2,3,3),imshow(BW3);

title(『prewittedgecheck』);

subplot(2,3,4),imshow(BW4);

title(『logedgecheck』);

subplot(2,3,5),imshow(BW5);

title(『cannyedgecheck』);

subplot(2,3,6),imshow(BW6);

title(『gasussian&cannyedgecheck』);%此為用高斯濾波後Canny運算元邊緣檢測結果

(注意:代碼中有一些標點是中文模式,若輸入代碼後標點顯示紅色,則為中文標點,改回來就行了)

Ⅱ 為什麼opencv的canny函數檢測邊緣的效果和matlab的不同

可以明顯的看出matlab的邊緣更為細膩。
首先回顧一下傳統的canny算源含法的主要步驟:
1、使用sobel差分運算元求出灰度圖像的x和y方向導數;
2、求出圖像各點梯度大小及其方向;
3、設置高低兩個閾值,梯度大於高閾值為強邊像素點,大於低閾值為潛在可能是較弱的邊緣點;
4、在經過一次篩選剩下的強邊緣點中沿著雹舉笑梯度方向進行非極大值抑制;
5、順著二次篩選後的強邊點尋找鄰近的弱答爛邊點得到最終的邊緣。
opencv和matlab都基本按照以上步驟得到各自的canny 函數,但一般來說處理之前都先對圖像進行模糊平滑,這樣得到的效果更好。opencv更注重實時性,所以連平滑都作為可選項放在函數外,而matlab則 更注重質量,除了加入平滑操作外,還有其他一系列的優化操作,以下逐項比較。
1、模糊平滑
這一項其實對生成的邊緣效果影響十分大,平滑的越流暢則生成的邊緣越圓滑,一 般使用高斯低通濾波;那麼濾波器的大小以及高斯分布的方差是兩個關鍵的參數,通過實驗確定取什麼值最優,但一般用5×5和方差為2的就可以 了,opencv的cvSmooth函數可以進行平滑,一般都是使用輸入和輸出都是8位深的圖像,而matlab是把圖像轉換為浮點類型後進行平滑操作, 這樣一來從精度上說matlab就已經更勝一籌了,因為這直接決定後面的求導運算得到的兩個方向導數的精度。
2、梯度
在sobel的運用上兩者是一致的,但是求梯度的方向的演算法兩者是截然不同 的,但本質一樣,效果經過筆者測試基本相同。在梯度的大小方面,opencv提供了歐式距離和哈密頓距離兩種度量方式,前者是平方和後開方,後者是直接絕 對值的加和,opencv默認使用後者,我們知道((x2+y2)/2)1/2>=(|x|+|y|)/2,以及|x|+|y|>=(x2+y2)1/2 所以理論上使用哈密頓距離也基本符合真實數值,但總歸是有精度上的差別,這也是為什麼有人說opencv的canny不如matlab好的第二個原因了,在cv.h裡面可以通過修改CV_CANNY_L2_GRADIENT來進行切換。
3、閾值
這里的閾值是梯度大小是否能夠通過的開關,opencv的閾值都採用手工設置的方式,而matlab是把所有點的強度作出直方圖,保留一定百分比的強邊緣,這個步驟的差別不會影響結果的質量,但是在速度上當然會有差別,這是速度和方便程度的矛盾。
4、薄邊效果
經過非極大值抑制後的邊緣基本上是一到兩個像素點的寬度,最終希望得到一個線 寬的邊緣,opencv只是通過簡單的判斷來防止並行或者並列出現兩個強邊像素,這種簡單的薄邊手法會導致邊緣的斷裂,而matlab採用了Louisa Lam, Seong-Whan Lee, and Ching Y. Wuen, "Thinning Methodologies-A Comprehensive Survey," IEEE TrPAMI, vol. 14, no. 9, pp. 869-885, 1992. 這邊文章的方法進行兩次薄邊處理,效果相當好,所得的邊緣十分圓滑。
綜上所述,要想opencv的效果和matlab的差不多就必須在平 滑上下功夫,梯度的大小要用歐式距離度量,另外要加入matlab的薄邊演算法,這樣一來處理時間大概會增加一倍,但也基本可以滿足實時處理。另外在一般視 覺應用中可以把演算法修改為一個閾值,去掉強弱邊連接這一步驟以提高速度.

Ⅲ 在matlab軟體中用拉普拉斯運算元和canny運算元進行邊緣檢測的程序

i=imread('1.jpg'); 讀入弊含圖像1
i1=rgb2gray(i); 把rgb圖像轉換成灰度圖前塵像
bw1=edge(i1,'log',0.07); 做閾值為0.07的高斯—拉普拉斯(Log)演算法
figure(3),imshow(i); 顯示原圖
figure(4),imshow(bw1); 顯示高斯—拉普拉租悔笑斯(Log)邊緣檢測後的圖

Ⅳ matlab canny運算元邊緣檢測函數代碼是什麼

I = imread('lena.bmp'); %%如果是其他類型圖像,請先轉換為灰度圖

%%沒有雜訊時的檢測結果

BW_sobel = edge(I,'sobel');

BW_prewitt = edge(I,'prewitt');

BW_roberts = edge(I,'roberts');

BW_laplace = edge(I,'log');

BW_canny = edge(I,'canny'); figure(1);

subplot(2,3,1),imshow(I),xlabel('原始圖像'畢備);

subplot(2,3,2),imshow(BW_sobel),xlabel('sobel檢測');

subplot(2,3,3),imshow(BW_prewitt),xlabel('prewitt檢測');

subplot(2,3,4),imshow(BW_roberts),xlabel('roberts檢測');

subplot(2,3,5),imshow(BW_laplace),xlabel('laplace檢測');

subplot(2,3,6),imshow(BW_canny),xlabel('canny檢測');

%%加入高斯雜訊(μ=0,σ^2=0.01)檢測結果

I_g1 = imnoise(I,'gaussian',0,0.01);

BW_sobel = edge(I_g1,'sobel');

BW_prewitt = edge(I_g1,'prewitt');

BW_roberts = edge(I_g1,'roberts');

BW_laplace = edge(I_g1,'log');亂數鎮

BW_canny = edge(I_g1,'canny'); figure(2);

subplot(2,3,1),imshow(I_g1),xlabel('加入高斯雜訊(μ=0,σ^2=0.01)圖像');

subplot(2,3,2),imshow(BW_sobel),xlabel('sobel檢測');

subplot(2,3,3),imshow(BW_prewitt),xlabel('prewitt檢測');

subplot(2,3,4),imshow(BW_roberts),xlabel('roberts檢測');

subplot(2,3,5),imshow(BW_laplace),xlabel('laplace檢測');

subplot(2,3,6),imshow(BW_canny),xlabel('canny檢測');

%%加入高斯雜訊(μ=0,σ^2=0.02)檢測結果

I_g2 = imnoise(I,'gaussian',0,0.02);

BW_sobel = edge(I_g2,'sobel');

BW_prewitt = edge(I_g2,'prewitt');

BW_roberts = edge(I_g2,'roberts');

BW_laplace = edge(I_g2,'log');

BW_canny = edge(I_g2,'canny'); figure(3);

subplot(2,3,1),imshow(I_g2),xlabel('加入高斯雜訊(μ=0,σ^2=0.02)圖像');

subplot(2,3,2),imshow(BW_sobel),xlabel('sobel檢測');

subplot(2,3,3),imshow(BW_prewitt),xlabel('prewitt檢測');

subplot(2,3,4),imshow(BW_roberts),xlabel('嘩粗roberts檢測');

subplot(2,3,5),imshow(BW_laplace),xlabel('laplace檢測');

subplot(2,3,6),imshow(BW_canny),xlabel('c

Ⅳ matlab 自帶的canny函數

Canny Method

BW = edge(I,'canny') specifies the Canny method.

BW = edge(I,'canny',thresh) specifies sensitivity thresholds for the Canny method. thresh is a two-element vector in which the first element is the low threshold, and the second element is the high threshold. If you specify a scalar for thresh, this scalar value is used for the high threshold and 0.4*thresh is used for the low threshold. If you do not specify thresh, or if thresh is empty ([]), edge chooses low and high values automatically. The value for thresh is relative to the highest value of the gradient magnitude of the imag

Ⅵ 基於matlab邊緣提取的幾種方法的比較

I=imread('lena.bmp');% 提取圖像
BW1=edge(I,'sobel'); %用SOBEL運算元進行邊緣檢測
BW2=edge(I,'roberts');%用Roberts運算元進行邊緣檢測
BW3=edge(I,'prewitt'); %用prewitt運算元進行邊緣脊襲喚檢測
BW4=edge(I,'log'); %用log運算元進行邊緣檢測
BW5=edge(I,'canny'); %用canny運算元進行邊緣檢測
h=fspecial('gaussian』,5);
BW6=edge(I,』canny』);
subplot(2,3,1), imshow(BW1);
title(『sobel edge check』);
subplot(2,3,2), imshow(BW2);
title(『sobel edge check』);
subplot(2,3,3), imshow(BW3);
title(『prewitt edge check』);
subplot(2,3,4), imshow(BW4);
title(『log edge check』);
subplot(2,3,5), imshow(BW5);
title(『canny edge check』);
subplot(2,3,6), imshow(BW6);
title(『gasussian&canny edge check』);%此為用高斯濾波後Canny運算元邊緣檢測結果
(注意:代碼中禪梁有一些標點是中文模式,若輸入代碼後標點顯示紅色櫻凱,則為中文標點,改回來就行了)

Ⅶ MATLAB 圖像處理

下邊的程序是我自己編的希望能給你參考。其中的imhist是顯示直方圖的,如果你不用可以直接刪去。我已經將程序里的圖片地址寫成了d:\blood.jpg你將圖片存在d盤,標明名字blood,注意類型為jpg即可。
1.1
顯示更加清楚可以用直方圖均衡化。
程序1:
%直方圖均衡化,令對比度自適應直方圖均衡化
I=imread('你的圖片(注意要用英文的。比如'd:\blood.jpg')');
I=rgb2gray(I);
J=adapthisteq(I);
subplot(221),imshow(I)
title('原圖');
subplot(222),imshow(J)
title('直方圖均衡化後的結果')
subplot(223),imhist(I,64)
title('原春悔櫻圖的直方圖');
subplot(224),imhist(J,64)
title('直方圖均衡化後的結果的直方圖');
1.2 讓圖片看前拆清楚還可以讓圖片變亮一些(因為你這圖看起來很暗)。
程序2:
I=imread('d:\blood.jpg');
J=imadjust(I,[],[0.5 1]);
%通過修改highout值使圖片變亮
K=imadjust(I,[],[],0.3);
%通過修改r(描述I,J關系曲線形狀)
subplot(231),imshow(I);
title('原圖');
subplot(232),imshow(J);
title('修改highout');
subplot(233),imshow(K);
title('修改r值')
subplot(234),imhist(I,64);
title('原圖的直方圖');
subplot(235),imhist(J,64);
title('修改highout直方圖');
subplot(236),imhist(K,64);
title('修改r值直方圖');
2.1 邊緣檢測的有很多運算元,你自己試試看哪個運算元比較好。
程序3:
I=imread('d:\blood.jpg');
figure,imshow(I);%顯示原圖
f= rgb2gray(I);%轉化為灰度圖
BW1=edge(f,'Roberts');%使用roberts運算元進行邊緣提取
figure;imshow(BW1); %顯示邊緣提取結果
BW2=edge(f,'sobel');%使用sobel運算元進行邊緣提取
figure;imshow(BW2);%顯示邊緣提取結果

BW3=edge(f,'prewitt');%使用prewitt運算元進行邊緣提取
figure;imshow(BW3);%顯示邊緣扒叢提取結果

BW4=edge(f,'log');%使用log運算元進行邊緣提取
figure;imshow(BW4);%顯示邊緣提取結果

BW5=edge(f,'canny');%使用canny運算元進行邊緣提取
figure;imshow(BW4);%顯示邊緣提取結果

Ⅷ 求助Matlab計算canny運算元閾值的方法

解法1:solve('x^2-10') %用氏和於一般的方程,也包括指數、餘弦等碼核襪復雜方程
解法2:roots([1 0 -10]) %用於遲激多項式方程
解法3:fzero採用零點,是極限的求法
f=@(x) x^2-10;
y3_1=fzero(f,[0,5]),y3_2=fzero(f,[-5,0])

Ⅸ 基於matlab的邊緣檢測的robert運算元的演算法怎麼寫

matlab本身有庫函數的。直接調用啊
VC代碼:
void BianYuanJianCeDib::Robert()
{
LPBYTE p_data; //原圖數據區指針
int wide,height; //原圖長、寬
int i,j; //循環變數
int pixel[4]; //Robert運算元
p_data=this->GetData ();
wide=this->GetWidth ();
height=this->GetHeight ();
LPBYTE temp=new BYTE[wide*height]; //新圖像緩沖區
//設定新圖像初值為255
memset(temp,255, wide*height);
//由於使用2*2的模板,為防止越界,所以不處理最下邊和最右邊的兩列像素
for(j=0;j<height-1;j++)
for(i=0;i<wide-1;i++)
{
//生成Robert運算元
pixel[0]=p_data[j*wide+i];
pixel[1]=p_data[j*wide+i+1];
pixel[2]=p_data[(j+1)*wide+i];
pixel[3]=p_data[(j+1)*wide+i+1];
//處理當前像素
temp[j*wide+i]=(int)sqrt((pixel[0]-pixel[3])*(pixel[0]-pixel[3])
+(pixel[1]-pixel[2])*(pixel[1]-pixel[2]));
}
//將緩沖區中的數據復制到原圖數據區
memcpy(p_data, temp,wide*height);
//刪除緩沖區
delete temp;
}

Ⅹ 需要一段用Canny運算元實現圖像邊緣檢測的MATLAB程序,拜託高手們幫幫忙,很急啊!

M=imread('');%讀入你的圖片
BW = edge(I,'canny');%邊緣檢測函數
imshow(BW) %顯示檢測後的圖象

熱點內容
oppo錄音文件在哪個文件夾 發布:2024-04-23 22:22:54 瀏覽:596
客戶端電腦與伺服器通訊發生錯誤 發布:2024-04-23 22:22:53 瀏覽:428
電腦原始伺服器名 發布:2024-04-23 22:01:52 瀏覽:55
21款發現5哪個配置透明引擎蓋 發布:2024-04-23 21:20:18 瀏覽:873
adb拷文件夾 發布:2024-04-23 21:12:25 瀏覽:10
如何破解wmv加密視頻 發布:2024-04-23 21:11:44 瀏覽:558
安卓拍抖音怎麼把聲音錄進去 發布:2024-04-23 20:58:51 瀏覽:847
安卓fifa15怎麼恢復數據 發布:2024-04-23 20:58:42 瀏覽:243
卸載oracle資料庫 發布:2024-04-23 20:36:26 瀏覽:522
發帖站源碼 發布:2024-04-23 20:22:45 瀏覽:683