① matlab不使用內置函數edge等等,如何根據原理直接實現LOG運算元
edge不是matlab的內置函數,如何判斷可以用
>>type edge 是否能顯示其函數內容,如能顯示就不是內置函數。
如不用edge函數,可以根據LOG運算元(邊緣檢測演算法)來實現edge函數的功能。
實現LOG運算元的步驟:(1) 採用二維高斯濾波器平滑濾波; (2) 採用二維拉普運算元進行圖像增強; (3) 依據二階導數零交叉進行邊緣檢測。
② matlab遺傳演算法中的交叉運算元函數應該怎麼編寫
function [xv,fv]=myGA(fitness,a,b,NP,NG,Pc,Pm,eps)
L = ceil(log2((b-a)/eps+1)); %根據離散精度,確定二進制編碼需要的碼長
x = zeros(NP,L);
for i=1:NP
x(i,:) = Initial(L); %種群初始化
fx(i) = fitness(Dec(a,b,x(i,:),L)); %個體適應值
end
for k=1:NG
sumfx = sum(fx); %所有個體適應值之和
Px = fx/sumfx; %所有個體適應值的平均值
PPx = 0;
PPx(1) = Px(1);
for i=2:NP %用於輪盤賭策略的概率累加
PPx(i) = PPx(i-1) + Px(i);
end
for i=1:NP
sita = rand();
for n=1:NP
if sita <= PPx(n)
SelFather = n; %根據輪盤賭策略確定的父親
break;
end
end
Selmother = floor(rand()*(NP-1))+1; %隨機選擇母親
posCut = floor(rand()*(L-2)) + 1; %隨機確定交叉點
r1 = rand();
if r1<=Pc %交叉
nx(i,1:posCut) = x(SelFather,1:posCut);
nx(i,(posCut+1):L) = x(Selmother,(posCut+1):L);
r2 = rand();
if r2 <= Pm %變異
posMut = round(rand()*(L-1) + 1);
nx(i,posMut) = ~nx(i,posMut);
end
else
nx(i,:) = x(SelFather,:);
end
end
x = nx;
for i=1:NP
fx(i) = fitness(Dec(a,b,x(i,:),L)); %子代適應值
end
end
fv = -inf;
for i=1:NP
fitx = fitness(Dec(a,b,x(i,:),L));
if fitx > fv
fv = fitx; %取個體中的最好值作為最終結果
xv = Dec(a,b,x(i,:),L);
end
end
function result = Initial(length) %初始化函數
for i=1:length
r = rand();
result(i) = round(r);
end
function y = Dec(a,b,x,L) %二進制編碼轉換為十進制編碼
base = 2.^((L-1):-1:0);
y = dot(base,x);
y = a + y*(b-a)/(2^L-1);
③ 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關於圖像邊緣提取,用Sobel運算元、Roberts運算元、Prewitt運算元,加QQ詳談 急用!!
4.2.1 Roberts演算法原理
Roberts運算元是一種最簡單的運算元,是一種利用局部差分運算元尋找邊緣的運算元,他採用對角線方向相鄰兩象素之差近似梯度幅值檢測邊緣。檢測垂直邊緣的效果好於斜向邊緣,定位精度高,對雜訊敏感,無法抑制雜訊的影響。
4.2.2 演算法流程
Roberts運算元在2×2領域上計算對角導數
(4-1)
成為Roberts交叉運算元。在實際應用中為了簡化計算,用梯度函數的Roberts絕對值來近似
(4-2)另外還可以用Roberts 最大運算元來計算
(4-3)
上式能夠提供較好的不變性邊緣取向。對於同等長度但取向不同的邊緣,應用Roberts最大值運算元比應用Roberts交叉運算元所得到的合成幅度變化小。Roberts邊緣檢測運算元的卷積運算元為
Roberts 邊緣運算元方向模版
由上面兩個卷積運算元對圖像運算後,代入(3-7)式,可求得圖像的梯度幅度值,然後選取門限TH,做如下判斷>TH,為階躍狀邊緣點為一個二值圖像,也就是圖像的邊緣圖像。4.4.1 Prewitt 演算法原理
Prewitt邊緣運算元是一種邊緣樣板運算元。Prewitt 從加大邊緣檢測運算元的模板大小出發,由2×2 擴大到3×3 來計算差分運算元,採用Prewitt 運算元不僅能檢測邊緣點,而且能抑制雜訊的影響。
Prewitt 採用計算偏微分估計的方法,由式(4-9)所示的兩個卷積運算元形成了Prewitt邊緣運算元,樣板運算元由理想的邊緣子圖像構成,依次用邊緣樣板去檢測圖像,與被檢測區域最為相似的樣板給出最大值,用這個最大值作為運算元的輸出
(4-9)
另一種方法是,可以將Prewitt運算元擴展到八個方向,每個模版對特定的邊緣方向做出最大響應,所有8個方向中最大值作為邊緣幅度圖像的輸出,這些運算元樣板由離線的邊緣子圖像構成。依次用邊緣樣板去檢測圖像,與被檢測區域最為相似的的樣板給出最大值。定義Prewitt 邊緣檢測的運算元模版如下:
(1)1方向 (2)2方向 (3)3方向 (4)4方
⑤ Matlab中邏輯運算符有哪些運算規則是什麼
Matlab共4種邏輯運算符和運算規則如下:
元素級(Element-Wise)的邏輯運算符用於對標量或矩陣元素進行邏輯運算,得到一個結果標量或結果矩陣。假設操作數為a和b,則元素級邏輯運算符包括:
1、a&b: 與運算,兩標量或兩元素均非0則返回1,否則返回0. 注意,在if條件語句中,兩個表達式的與操作用&&。
2、a|b: 或運算,兩標量或者兩元素至少有一個是非0則返回1,否則返回0. 在條件語句中,兩個表達式的或用||。
3、~a: 非運算,對作用的標量或矩陣元素求補,如果標量或者矩陣元素為0則結果為1,如果標量或矩陣元素不為0則結果為0。
4、xor(a,b): 異或運算,兩標量或兩元素均非0或均為0則返回0,否則返回1。
(5)matlab運算元演算法擴展閱讀:
計算機編程布爾運算(邏輯運算)
邏輯運算通常用來測試真假值。最常見到的邏輯運算就是循環的處理,用來判斷是否該離開循環或繼續執行循環內的指令。
各種編程語言中的邏輯運算符:
C語言:
與:&&
或:||
非:!
異或:^
Pascal:
與:and
或:or
非:not
異或:xor
⑥ 運用Matlab利用運算元法進行數字圖像邊緣檢測(只需三四行 限於本人知識有限 謝謝各位吖)
clear all;
I=imread('**.***');%自己輸入圖片路徑
GryIm=rgb2gray(I);%變灰度,如果是灰度圖,直接刪掉它
BW=edge(GryIm,'sobel');%後邊的參數『sobel』或'roberts'自己改
subplot(2,2,1);imshow(I);title('Oringal Image');
subplot(2,2,2);imshow(BW);title('Edge detect of sobel');
⑦ 基於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;
}