變換使用的模板必須是單連通的,而且模板中心必須在模板內,如果在模板中打個結或是月牙形,這裡的程式就處理不了了。
雖然非單連通模板也有辦法處理,不過不是這裡要討論的。
這裡用到的方法和矩形變換為圓那片文章中用的方法幾乎一樣,變換前後畫素按比例縮減,不過在判斷弧度和影象邊界到模板中心距離時略有不同。
變換為圓時弧度可以直接計算出來,而變換為任意形狀只能算出乙個最小相似值。
至於影象邊界到模板中心距離只能分八種情況判斷了,處理圓時可以根據對稱性簡化程式,這裡似乎沒有什麼好辦法簡化。
變換細節上,那篇文章中使用的是正向插值,這裡使用正向插值則會產生很多空洞,因此選擇了更常見的逆向插值。
處理結果如下:
原圖:
模板:
結果:
matlab**如下:
);[liney linex]=ind2sub([h w],ind); %模板形狀畫素的位置
ceny=round(mean(liney)); %模板形狀中心
cenx=round(mean(linex));
lineang=atan2(liney-ceny,linex-cenx); %模板線上每個點到形狀中心弧度
liner=sqrt((liney-ceny).^2+(linex-cenx).^2
); %模板線上每個點到形狀中心距離
ang_ul=atan2(1-ceny,1-cenx); %影象四個點與模板形狀中心弧度
ang_ur=atan2(1-ceny,w-cenx);
ang_dl=atan2(h-ceny,1-cenx);
ang_dr=atan2(h-ceny,w-cenx);
for y=1
:h
for x=1
:w r=sqrt((x-cenx)^2+(y-ceny)^2
); ang=atan2(y-ceny,x-cenx);
if ang>=-pi && ang
r=abs(cenx/cos(ang)); %應該可以簡化,這樣判斷似乎繁瑣了
elseif ang>=ang_ul && ang
r=abs(ceny/cos(pi/2-ang));
elseif ang>=-pi/2 && ang
r=abs(ceny/cos(pi/2+ang));
elseif ang>=ang_ur && ang<0
r=abs((w-cenx)/cos(pi-ang));
elseif ang>=0 && ang
r=abs((w-cenx)/cos(ang));
elseif ang>=ang_dr && ang< pi/2
r=abs((h-ceny)/cos(pi/2-ang));
elseif ang>=pi/2 && ang
r=abs((h-ceny)/cos(pi/2+ang));
elseif ang>=ang_dl && ang<=pi
r=abs(cenx/cos(pi-ang));
end[junk index]=min(abs(ang-lineang)); %距離最近的弧度
newr=liner(index);
ss=r*r/newr; %縮減擴充套件比例係數
xx=round((ss*cos(ang)+cenx));
yy=round((ss*sin(ang)+ceny));
if xx>=1 && xx<=w && yy>=1 && yy<=h
imgn(y,x)=img(yy,xx);
endend
endimshow(img);
figure;imshow(mask_line);
figure;imshow(imgn,)
題外話:
今天等了一天在京東訂的kindle,到下午5點都還沒送來,最後發現竟然是手機沒訊號,沒有收到送貨通知。
中國移動一定是看我用的2g卡,又沒開上網功能,欺負人,不給優先順序。
如果收到貨,也許現在正在玩kindle,就不會有這篇文章了。
matlab練習程式(矩形變換為圓)
最近對影象座標的變換很感興趣啊,這次是將一張影象變換為圓形。變換原理就是按變換前後畫素到圓心的距離按比例縮減就行了。改變x,y方向上的係數,應該還可以變換為橢圓,不過我還沒有嘗試。注意我這裡相當於縮小影象了,所以用的是正向插值,如果想生成乙個大圓,還是需要逆向插值的。原圖如下 處理後效果 matla...
canvas練習單個矩形形變
您的瀏覽器不支援canvas 紅色線以及其內部是變幻矩形的區域 綠色小方塊是四個角的操作區域,可以同時改變寬高 黃色部分是通過邊來單一改變矩形寬高的 將這些區域的路徑資料值寬高存到pathes陣列中,並且以他們的索引值作為代號 通過ispointinpath 這個函式判斷滑鼠在哪個路徑裡面,然後進行...
matlab練習程式(最小包圍矩形)
又是計算幾何,我感覺最近對計算幾何上癮了。當然,工作上也會用一些,不過工作上一般直接呼叫boost的geometry庫。上次寫過最小包圍圓,這次是最小包圍矩形,要比最小包圍圓複雜些。最小包圍矩形可不一定是個直立的矩形,也可能像下圖一樣是傾斜的。求法如下 1.求多邊形凸包,這裡凸包直接呼叫系統函式了,...