matlab練習程式(矩形變換為單連通形狀)

2021-09-07 21:26:42 字數 2522 閱讀 9213

變換使用的模板必須是單連通的,而且模板中心必須在模板內,如果在模板中打個結或是月牙形,這裡的程式就處理不了了。

雖然非單連通模板也有辦法處理,不過不是這裡要討論的。

這裡用到的方法和矩形變換為圓那片文章中用的方法幾乎一樣,變換前後畫素按比例縮減,不過在判斷弧度和影象邊界到模板中心距離時略有不同。

變換為圓時弧度可以直接計算出來,而變換為任意形狀只能算出乙個最小相似值。

至於影象邊界到模板中心距離只能分八種情況判斷了,處理圓時可以根據對稱性簡化程式,這裡似乎沒有什麼好辦法簡化。

變換細節上,那篇文章中使用的是正向插值,這裡使用正向插值則會產生很多空洞,因此選擇了更常見的逆向插值。

處理結果如下:

原圖:

模板:

結果:

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.求多邊形凸包,這裡凸包直接呼叫系統函式了,...