2016-11-13 51 views
0

我想申請以下變換函數爲灰度圖像,我知道如何將其應用到下面的函數,程序下面的變換功能適用於灰度圖像

transformation function

我的問題是如何將程序適用於以下變換功能,

what i wanted to be done

代碼到目前爲止,

clear; 
pollen = imread('Fig3.10(b).jpg'); 
u = double(pollen); 
[nx ny] = size(u) 
nshades = 256; 
r1 = 80; s1 = 10; % Transformation by piecewise linear function. 
r2 = 140; s2 = 245; 
for i = 1:nx 
for j = 1:ny 
if (u(i,j)< r1) 
uspread(i,j) = ((s1-0)/(r1-0))*u(i,j) 
end 
if ((u(i,j)>=r1) & (u(i,j)<= r2)) 
uspread(i,j) = ((s2 - s1)/(r2 - r1))*(u(i,j) - r1)+ s1; 
end 
if (u(i,j)>r2) 
uspread(i,j) = ((255 - s2)/(255 - r2))*(u(i,j) - r2) + s2; 
end 
end 
end 
hist= zeros(nshades,1); 
for i=1:nx 
for j=1:ny 
for k=0:nshades-1 
if uspread(i,j)==k 
hist(k+1)=hist(k+1)+1; 
end 
end 
end 
end 
plot(hist); 
pollenspreadmat = uint8(uspread); 
imwrite(pollenspreadmat, 'pollenspread.jpg'); 

在此先感謝

回答

0

的數字說,對於那些AB之間的任何強度,它們應該被設置爲C。您只需修改兩個for環路,以便對於AB之間的任何值,將輸出位置設置爲C。我也會假設範圍是包容性的。你可以簡單地刪除第一個和最後if條件和使用中間的一個:

for i = 1:nx 
    for j = 1:ny 
     if ((u(i,j)>=r1) && (u(i,j)<= r2)) 
      uspread(i,j) = C; 
     end 
    end 
end 

C是一個常數,你會爲自己設定。通常對於分割,這個結果非常高以區分前景和背景。你在這裏有一個uint8的圖像,所以C = 255;會工作。

但是,我會建議你實現更加矢量化的解決方案。避免for循環並使用logical索引來代替:

uspread = u; 
uspread(u >= r1 & u <= r2) = C; 
+0

我如何定義'C' –

+0

這是給你的。你自己定義它。有些人喜歡選擇一個很大的值來從圖像中分割出一些東西。也許255. – rayryeng

+1

感謝您的響應先生:) –