版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第3章數(shù)字圖像的幾何運(yùn)算目錄圖像平移Contents1圖像縮放2圖像旋轉(zhuǎn)3圖像剪切4圖像鏡像變換5圖像透視變換6圖像極坐標(biāo)變換7圖像平移3.1dst=cv2.warpAffine(src,M,dsize[,flags[,borderMode[,borderValue]]])其中輸入輸出參數(shù)如下:dst:輸出圖像;src:輸入圖像;M:2×3的變換矩陣,一般反映平移或旋轉(zhuǎn)的關(guān)系;dsize:輸出圖像大??;flags:插值方法(int類型),默認(rèn)為:cv2.INTER_LINEAR(線性插值);borderMode:邊界像素模式(int類型);borderValue:邊界像素填充值,默認(rèn)為0(黑色)。圖像平移是將圖像的所有像素坐標(biāo)進(jìn)行水平或垂直方向移動(dòng),也就是將圖像中所有像素按照指定的平移量在水平方向上沿x軸、垂直方向上沿y軸移動(dòng)。圖像平移是圖像仿射的一種,因此它用到的函數(shù)就是仿射變換的函數(shù),其語法格式為:插值方法以及對(duì)應(yīng)說明類型說明cv2.INTER_NEAREST最近鄰插值cv2.INTER_LINEAR雙線性插值(默認(rèn)方式)cv2.INTER_CUBIC三次樣條插值cv2.INTER_AREA區(qū)域插值,根據(jù)當(dāng)前像素點(diǎn)周邊區(qū)域的像素實(shí)現(xiàn)當(dāng)前像素點(diǎn)的采樣cv2.INTER_LANCZOS4cv2.INTER_LINEAR_EXACT位精確雙線性插值cv2.INTER_MAX差值編碼掩碼cv2.INTER_WARP_FILL_OUTLIERS標(biāo)志,填補(bǔ)目標(biāo)圖像中的所有像素
cv2.WARP_INVERSE_MAP平移是物體位置的移動(dòng),如在(x,y)方向上的位移,移動(dòng)距離設(shè)為(tx,ty),創(chuàng)建轉(zhuǎn)換矩陣M,如下式所示:
轉(zhuǎn)換矩陣M由np.float32()類型的Numpy數(shù)組產(chǎn)生,并將其傳遞給cv2.warpAffine函數(shù)。在原圖像的大小不變的情況下,只是將圖像平移到另一個(gè)位置,這時(shí)顯示窗口尺寸變大。3.1.1顯示窗口改變的圖像平移【例3.1】使用仿射變換函數(shù)cv2.warpAffine()實(shí)現(xiàn)顯示圖像窗口大小改變的平移。程序代碼如下:importcv2importnumpyasnpimg=cv2.imread('d:/pics/lena.jpg')#構(gòu)造移動(dòng)矩陣M,設(shè)在x軸方向移動(dòng)50個(gè)像素和在y軸方向移動(dòng)25個(gè)像素的距離M=np.float32([[1,0,50],[0,1,25]])rows,cols=img.shape[0:2]#注意rows和cols需要反置,即先列后行dst=cv2.warpAffine(img,M,(2*cols,2*rows))cv2.imshow('Origin_image',img)cv2.imshow('New_picture',dst)cv2.waitKey(0)cv2.destroyAllWindows()圖中(a)為原始圖像,(b)為平移后的圖像。dsize這個(gè)參數(shù)是規(guī)定輸出圖像的尺寸,它是先列后行的。這里將輸出尺寸擴(kuò)大了4倍,默認(rèn)的邊界像素為0,所以外圍都是黑色。(a)(b)在顯示窗口不變的情況下,對(duì)圖像進(jìn)行平移,這樣原圖像中會(huì)有一部分不在顯示窗口中,將會(huì)有部分圖像丟失。3.1.2顯示窗口不變的圖像平移【例3.2】使用仿射變換函數(shù)cv2.warpAffine()實(shí)現(xiàn)圖像顯示窗口大小不改變的平移。程序代碼如下:importcv2importnumpyasnpimg=cv2.imread('d:/pics/lena.jpg')#構(gòu)造移動(dòng)矩陣M,設(shè)定在x軸方向移動(dòng)的距離和在y軸方向移動(dòng)的距離M=np.float32([[1,0,50],[0,1,25]])rows,cols=img.shape[0:2]#注意這里rows和cols需要反置,即先列后行dst=cv2.warpAffine(img,M,(cols,rows))cv2.imshow('Origin_image',img)cv2.imshow('New_image',dst)cv2.waitKey(0)cv2.destroyAllWindows()圖中(a)為原始圖像,(b)為平移后的圖像??梢钥吹剑灰獙⒗?.1代碼改為:dst=cv2.warpAffine(img,M,(cols,rows)),結(jié)果將會(huì)實(shí)現(xiàn)顯示圖像窗口不變的平移。(a)(b)在仿射變換的實(shí)際應(yīng)用中,原始圖像中的所有平行線在輸出圖像中希望繼續(xù)保持平行,我們就需要輸入圖像中的三個(gè)點(diǎn)及其在輸出圖像中的對(duì)應(yīng)位置,然后通過cv2.getAffineTransform()函數(shù)將創(chuàng)建一個(gè)2×3變換矩陣,并將該矩陣傳遞給cv2.warpAffine()函數(shù),實(shí)現(xiàn)圖像中的平行線在仿射變換前后一直保持平行。
函數(shù)cv2.getAffineTransform()語法格式為:3.1.3仿射變換應(yīng)用實(shí)例M=cv2.getAffineTransform(src,dst)其中輸入輸出參數(shù)為:src:原始圖像中的三個(gè)點(diǎn)的坐標(biāo);dst:變換后的這三個(gè)點(diǎn)對(duì)應(yīng)的坐標(biāo);M:根據(jù)三個(gè)對(duì)應(yīng)點(diǎn)求出的仿射變換矩陣。3.1.3仿射變換應(yīng)用實(shí)例importcv2importnumpyasnpfrommatplotlibimportpyplotaspltimg=cv2.imread('d:/pics/drawpic.png')rows,cols,ch=img.shape#選擇合適的數(shù)據(jù)點(diǎn)pts1=np.float32([[50,50],[200,50],[50,200]])pts2=np.float32([[10,100],[200,50],[100,250]])#創(chuàng)建M變換矩陣M=cv2.getAffineTransform(pts1,pts2)#仿射變換dst=cv2.warpAffine(img,M,(cols,rows))#輸出顯示plt.subplot(121),plt.imshow(img),plt.title('Input')plt.subplot(122),plt.imshow(dst),plt.title('Output')plt.show()(a)(b)【例3.3】在圖像選擇合適的點(diǎn)(藍(lán)色點(diǎn)),創(chuàng)建變換矩陣,實(shí)現(xiàn)仿射變換。程序代碼如下:程序運(yùn)行結(jié)果如圖所示。圖像縮放3.2dst=cv2.resize(src,dsize[,fx[,fy[,interpolation]]])其中輸入?yún)?shù):src:輸入圖像;dsize:輸出圖像的尺寸,與下面的比例因子二選一;fx:沿水平軸的比例因子;fy:沿垂直軸的比例因子;interpolation:插值方法,默認(rèn)為cv2.INTER_NEAREST(最近鄰插值)。圖像縮放有兩種方法:一種是通過設(shè)置縮放比例,來對(duì)圖像進(jìn)行放大和縮?。涣硪环N是直接設(shè)置圖像的大小,不需要縮放因子。圖像縮放,就是對(duì)圖像進(jìn)行放大或縮小的改變,其本質(zhì)就是改變圖像的寬度和高度,可以放大寬高,也可以縮小寬高。
圖像縮放算法主要有最近鄰域插值算法、雙線性插值算法、立方插值算法和像素關(guān)系重采樣算法。其中,OpenCV默認(rèn)使用雙線性插值算法對(duì)圖像進(jìn)行縮放。
在OpenCV中可以調(diào)用resize函數(shù)對(duì)圖像進(jìn)行縮放?!纠?.4】分別通過設(shè)置縮放比例的方法和直接設(shè)置圖像的大小方法,利用仿射變換函數(shù)cv2.warpAffine()實(shí)現(xiàn)對(duì)圖像的縮放。程序代碼如下:importcv2img=cv2.imread('d:/pics/lena.jpg')#方法一:通過設(shè)置縮放比例,來對(duì)圖像進(jìn)行放大或縮小dst1=cv2.resize(img,None,fx=1.2,fy=1.2,interpolation=cv2.INTER_CUBIC)#方法二:直接設(shè)置圖像的大小,不需要縮放因子height,width=160,160dst2=cv2.resize(img,(height,width),interpolation=cv2.INTER_LANCZOS4)cv2.imshow('Original_image',img)cv2.imshow('Result1',dst1)cv2.imshow('Result2',dst2)cv2.waitKey(0)cv2.destroyAllWindows()圖中,(a)為原始圖像,(b)是通過設(shè)置放縮比例放大的圖像,放縮比例為1.2,(c)為通過直接設(shè)置圖像大小,對(duì)原始圖像縮小后的圖像。(a)(b)(c)圖像旋轉(zhuǎn)3.3M=cv2.getRotationMatrix2D(center,angle,scale)其中輸入?yún)?shù):center:圖片的旋轉(zhuǎn)中心;angle:旋轉(zhuǎn)角度;scale:縮放比例,0.5表示縮小為原來的一半,這個(gè)參數(shù)還能表示旋轉(zhuǎn)方向,正數(shù)表示逆時(shí)針,負(fù)數(shù)表示順時(shí)針旋轉(zhuǎn)。通過這個(gè)函數(shù)可以直接根據(jù)給定中心、角度和縮放比例的值自動(dòng)求出變換矩陣,然后將這個(gè)矩陣作為仿射變換函數(shù)的M參數(shù),代入cv2.warpAffine函數(shù)中即可實(shí)現(xiàn)旋轉(zhuǎn)操作。
圖像旋轉(zhuǎn)是指圖像在某個(gè)位置轉(zhuǎn)動(dòng)一定角度,旋轉(zhuǎn)中圖像仍保持原始尺寸。圖像旋轉(zhuǎn)后圖像的水平對(duì)稱軸、垂直對(duì)稱軸及中心坐標(biāo)原點(diǎn)都可能會(huì)發(fā)生變化,因此需要對(duì)圖像旋轉(zhuǎn)中的坐標(biāo)進(jìn)行相應(yīng)轉(zhuǎn)換。旋轉(zhuǎn)后圖像的大小一般會(huì)改變,即可以把轉(zhuǎn)出顯示區(qū)域的圖像截去,或者擴(kuò)大圖像窗口顯示范圍來顯示全部圖像。
旋轉(zhuǎn)也是仿射變換的一種,所以操作的函數(shù)還是cv2.warpAffine,但是它的變換矩陣一般不像平移那樣簡(jiǎn)單,所以O(shè)penCV提供了一個(gè)專門用于圖像旋轉(zhuǎn)變換矩陣的函數(shù)cv2.getRotationMatrix2D(),其語法格式為:【例3.5】使用cv2.getRotationMatrix2D函數(shù)實(shí)現(xiàn)圖像的順時(shí)針、逆時(shí)針旋轉(zhuǎn)。程序代碼如下:importcv2img=cv2.imread('d:\pics\lena.jpg')rows,cols=img.shape[:2]#旋轉(zhuǎn)45度M=cv2.getRotationMatrix2D((cols/2,rows/2),45,1)dst=cv2.warpAffine(img,M,(cols,rows),borderValue=(255,255,255))cv2.imshow('Image',img)cv2.imshow('Rotationimage',dst)cv2.waitKey(0)cv2.destroyAllWindows()圖(a)為原始圖像,圖(b)為逆時(shí)針旋轉(zhuǎn)后的圖像。若將scale改為-1,即可進(jìn)行順時(shí)針旋轉(zhuǎn):M=cv2.getRotationMatrix2D((cols/2,rows/2),45,-1),順時(shí)針旋轉(zhuǎn)后程序運(yùn)行結(jié)果如下圖所示。
(a)(b)圖(a)為原始圖像,圖(b)為順時(shí)針旋轉(zhuǎn)后的圖像。【例3.6】通過上述M變換矩陣實(shí)現(xiàn)圖像邊緣無剪切的旋轉(zhuǎn)。程序代碼如下:importcv2importnumpyasnpimg=cv2.imread("d:/pics/lena.jpg",cv2.IMREAD_COLOR)h,w,c=img.shapeM=np.zeros((2,3),dtype=np.float32)alpha=np.cos(np.pi/4.0)beta=np.sin(np.pi/4.0)#初始旋轉(zhuǎn)矩陣M[0,0]=alphaM[1,1]=alphaM[0,1]=betaM[1,0]=-betacx=w/2cy=h/2tx=(1-alpha)*cx-beta*cyty=beta*cx+(1-alpha)*cyM[0,2]=txM[1,2]=ty#更改為全尺寸bound_w=int(h*np.abs(beta)+w*np.abs(alpha))bound_h=int(h*np.abs(alpha)+w*np.abs(beta))#添加中心位置遷移M[0,2]+=bound_w/2-cxM[1,2]+=bound_h/2-cydst=cv2.warpAffine(img,M,(bound_w,bound_h))cv2.imshow('Originimage',img)cv2.imshow("rotatewithoutcropping",dst)cv2.waitKey(0)cv2.destroyAllWindows()(a)(b)圖為圖像邊緣無剪切的旋轉(zhuǎn)的結(jié)果,圖(a)為原始圖像,圖(b)為旋轉(zhuǎn)后的圖像。圖像剪切3.4圖像剪切是指將圖像中我們感興趣的區(qū)域(ROI)以外的區(qū)域去除,可以將圖像剪切分為規(guī)則剪切和不規(guī)則剪切兩種類型。規(guī)則剪切:指剪切圖像的邊界范圍是一個(gè)矩形,剪切時(shí)只需要通過左上角和右下角兩點(diǎn)的坐標(biāo),就可以確定圖像的裁剪位置。不規(guī)則剪切:指剪切圖像的邊界范圍是任意多邊形,剪切時(shí)必須首先生成一個(gè)完整的閉合多邊形區(qū)域?!纠?.7】規(guī)則剪切:對(duì)圖像進(jìn)行規(guī)則裁剪。程序代碼如下:importcv2img=cv2.imread('d:/pics/lena.jpg')img1=img[30:160,20:180]#剪切區(qū)域cv2.imshow("Original",img)cv2.imshow("Result",img1)cv2.waitKey(0)cv2.destroyAllWindows()(a)(b)圖(a)為原始圖像,圖(b)為逆時(shí)針旋轉(zhuǎn)后的圖像?!纠?.8】不規(guī)則剪切:首先通過鼠標(biāo)左鍵在圖像上選取多個(gè)任意點(diǎn),連接成不規(guī)則的形狀;然后雙擊鼠標(biāo)左鍵,剪切出圖像的掩模區(qū)域和圖像區(qū)域;最后點(diǎn)擊鼠標(biāo)右鍵將圖像上的連線清除掉。程序代碼如下:importcv2importnumpyasnpdefOn_Mouse(event,x,y,flags,param):globalimg,point1,point2,count,pointsMaxgloballsPointsChoose,tpPointsChoose#存入選擇的點(diǎn)
globalpointsCount#對(duì)鼠標(biāo)按下的點(diǎn)計(jì)數(shù)
globalimg2,ROI_bymouse_flagimg2=img.copy()#保證每次都重新在原圖畫
ifevent==cv2.EVENT_LBUTTONDOWN:#左鍵點(diǎn)擊
pointsCount=pointsCount+1print('pointsCount:',pointsCount)point1=(x,y)print(x,y)cv2.circle(img2,point1,5,(0,255,0),2)#畫出點(diǎn)擊的點(diǎn)
#將選取的點(diǎn)保存到list列表里
lsPointsChoose.append([x,y])#用于轉(zhuǎn)化為darry提取多邊形ROItpPointsChoose.append((x,y))#用于畫點(diǎn)
#將鼠標(biāo)選的點(diǎn)用直線連起來
print(len(tpPointsChoose))foriinrange(len(tpPointsChoose)-1):print('i',i)cv2.line(img2,tpPointsChoose[i],tpPointsChoose[i+1],(0,0,255),2)cv2.imshow(‘src’,img2)#----右鍵點(diǎn)擊,清除軌跡-------------ifevent==cv2.EVENT_RBUTTONDOWN:print("right-mouse")pointsCount=0tpPointsChoose=[]lsPointsChoose=[]print(len(tpPointsChoose))foriinrange(len(tpPointsChoose)-1):print('i',i)cv2.line(img2,tpPointsChoose[i],tpPointsChoose[i+1],(0,0,255),2)cv2.imshow('src',img2)
#----雙擊鼠標(biāo),結(jié)束選取,繪制感興趣區(qū)域------ifevent==cv2.EVENT_LBUTTONDBLCLK:ROI_byMouse()ROI_bymouse_flag=1lsPointsChoose=[]
defROI_byMouse():globalsrc,ROI,ROI_flag,mask2mask=np.zeros(img.shape,np.uint8)pts=np.array([lsPointsChoose],32)#pts是多邊形的頂點(diǎn)列表
pts=pts.reshape((-1,1,2))#OpenCV中需要先將多邊形的頂點(diǎn)坐標(biāo)變成頂點(diǎn)數(shù)×1×2維的矩陣,再來繪制
mask=cv2.polylines(mask,[pts],True,(255,255,255))#畫多邊形
mask2=cv2.fillPoly(mask,[pts],(255,255,255))#填充多邊形
cv2.imshow('mask',mask2)
#掩模圖像與原圖像進(jìn)行“位與”操作
ROI=cv2.bitwise_and(mask2,img)cv2.imshow('ROI',ROI)if__name__=='__main__':#選擇點(diǎn)設(shè)置
lsPointsChoose=[]tpPointsChoose=[]pointsCount=0count=0pointsMax=6img=cv2.imread('d:/pics/lena.jpg')ROI=img.copy()dWindow('src')cv2.setMouseCallback('src',On_Mouse)cv2.imshow('src',img)cv2.waitKey(0)
cv2.destroyAllWindows()(a)鼠標(biāo)選取過程
(b)選取后的范圍
(c)原圖剪切后的圖像圖像鏡像變換3.5dst=cv2.flip(src,flipCode)其中輸入?yún)?shù):src:輸入圖像;flipCode:翻轉(zhuǎn)方向。用于指定鏡像翻轉(zhuǎn)的類型,其中0表示繞x軸翻轉(zhuǎn),即垂直鏡像翻轉(zhuǎn);1表示繞y軸翻轉(zhuǎn),即水平鏡像翻轉(zhuǎn);-1表示繞x軸、y軸兩個(gè)軸翻轉(zhuǎn),即對(duì)角鏡像翻轉(zhuǎn)。圖像的鏡像變換分為三種:水平鏡像、垂直鏡像和對(duì)角鏡像。水平鏡像以圖像垂直中線為軸,將圖像的像素左右進(jìn)行對(duì)換,也就是將圖像的左半部和右半部對(duì)調(diào)。垂直鏡像則是以圖像的水平中線為軸,將圖像的上半部分和下半部分對(duì)調(diào)。對(duì)角鏡像翻轉(zhuǎn)是以圖像水平中軸線和垂直中軸線的交點(diǎn)為中心進(jìn)行鏡像對(duì)換,也就是以圖像對(duì)角線為中心進(jìn)行的鏡像變換。OpenCV提供了對(duì)圖像進(jìn)行鏡像變換的函數(shù)flip,其格式為:【例3.9】使用cv2.flip函數(shù)實(shí)現(xiàn)圖像的水平、垂直以及對(duì)角鏡像變換。程序代碼如下:importcv2frommatplotlibimportpyplotaspltimg=cv2.imread('d:/pics/lena.jpg')img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)img0=cv2.flip(img,1)img1=cv2.flip(img,0)img2=cv2.flip(img,-1)plt.subplot(221),plt.imshow(img)plt.axis('off'),plt.title('Original')plt.subplot(222),plt.imshow(img0)plt.axis('off'),plt.title('Horizontal')plt.subplot(223),plt.imshow(img1)plt.axis('off'),plt.title('Vertical')plt.subplot(224),plt.imshow(img2)plt.axis('off'),plt.title('Diagonal')plt.show()圖中圖像的鏡像變換(其中左上為原始圖像,右上為水平鏡像變換后的圖像,左下為垂直鏡像變換后的圖像,右下對(duì)角鏡像變換后的圖像)圖像透視變換3.6M=cv2.getPerspectiveTransform(src,dst[,solveMethod])其中輸入?yún)?shù)為:src:表示透視變換前的4個(gè)點(diǎn)的位置;dst:表示透視變換后的4個(gè)對(duì)應(yīng)點(diǎn)的位置。透視變換是將圖片投影到一個(gè)新的視平面,也稱作投影映射。在透視變換中,原始圖像中的所有平行線在輸出圖像中希望繼續(xù)保持平行,我們就需要輸入圖像中的4個(gè)點(diǎn)及其在輸出圖像中的對(duì)應(yīng)位置,在這4個(gè)點(diǎn)中,其中3個(gè)不能共線。然后通過OpenCV提供的求透視變換矩陣cv2.getPerspectiveTransform()函數(shù)創(chuàng)建一個(gè)3×3變換矩陣,并將該矩陣傳遞給透視變換函數(shù)cv2.warpPerspective(),實(shí)現(xiàn)圖像中的平行線在透視變換前后始終保持平行。透視變換矩陣的函數(shù)cv2.warpPerspective語法格式如下:透視變換函數(shù)cv2.warpPerspectiv格式如下:dst=cv2.warpPerspective(src,M,dsize[,flags[,borderMode[,borderValue]]])其中輸入?yún)?shù)為:src:原始圖像。M:透視變換矩陣。dsize:輸出圖像的尺寸。【例3.10】在圖像上選擇合適的點(diǎn),創(chuàng)建透視變換矩陣,實(shí)現(xiàn)透視變換。程序代碼如下:importcv2importnumpyasnpfrommatplotlibimportpyplotaspltimg=cv2.imread('d:/pics/weiqi1.jpg')img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)rows,cols,ch=img.shape#選擇合適數(shù)據(jù)點(diǎn)pts1=np.float32([[50,60],[560,50],[30,580],[590,590]])pts2=np.float32([[0,0],[600,0],[0,600],[600,600]])#創(chuàng)建M透視變換矩陣M=cv2.getPerspectiveTransform(pts1,pts2)#透視變換dst=cv2.warpPerspective(img,M,(640,400))#顯示輸入輸出圖像plt.subplot(121),plt.imshow(img),plt.title('Input')plt.subplot(122),plt.imshow(dst),plt.title('Output')plt.show()(a)原始圖像
(b)透視變換后圖像圖像極坐標(biāo)變換3.7極坐標(biāo)變換就是將圖像在直角坐標(biāo)系與極坐標(biāo)系中互相轉(zhuǎn)換,極坐標(biāo)的轉(zhuǎn)換常用于對(duì)圓形如鐘表、圓盤等圖像進(jìn)行轉(zhuǎn)換,圓形圖案邊緣上的文字經(jīng)過極坐標(biāo)變換后可以垂直的排列在新圖像的邊緣,便于對(duì)文字的識(shí)別和檢測(cè)。OpenCV提供了cv2.cartToPolar()函數(shù)實(shí)現(xiàn)由直角坐標(biāo)系(或稱笛卡爾坐標(biāo))轉(zhuǎn)換為極坐標(biāo)系,cv2.polarToCart()函數(shù)由極坐標(biāo)系轉(zhuǎn)換為直角坐標(biāo)系。3.7.1數(shù)據(jù)點(diǎn)坐標(biāo)系間的轉(zhuǎn)換【例3.11】將數(shù)據(jù)點(diǎn)由直角坐標(biāo)系(x,y)轉(zhuǎn)換為極坐標(biāo)系(r,theta),再由極坐標(biāo)系轉(zhuǎn)換為直角坐標(biāo)系。程序代碼如下:importmathimportcv2importnumpyasnpx,y=3,5print('直角坐標(biāo)x=',x,'\n直角坐標(biāo)y=',y)#math庫(kù)函數(shù)計(jì)算center=[0,0]#中心點(diǎn)r=math.sqrt(math.pow(x-center[0],2)+math.pow(y-center[1],2))theta=math.atan2(y-center[1],x-center[0])/math.pi*180#轉(zhuǎn)換為角度print('math庫(kù)r=',r)print('math庫(kù)theta=',theta)#opencv也提供了極坐標(biāo)變換的函數(shù)x1=np.array(x,np.float32)y1=np.array(y,np.float32)#變換中心為原點(diǎn),若想為(2,3)需x1-2,y1-3r1,theta1=cv2.cartToPolar(x1,y1,angleInDegrees=True)#當(dāng)angleInDegrees是True時(shí),返回值為angle角度,否則為弧度print('OpenCV庫(kù)函數(shù)r=',r1)print('OpenCV庫(kù)函數(shù)thetar=',theta1)#反變換,即將極坐標(biāo)變?yōu)榈芽栕鴺?biāo)。(r,theta)變換為(x,y)x1,y1=cv2.polarToCart(r1,theta1,angleInDegrees=True)print('極坐標(biāo)變?yōu)榈芽栕鴺?biāo)x=',np.round(x1[0]))print('極坐標(biāo)變?yōu)榈芽栕鴺?biāo)y=',np.round(y1[0]))程序運(yùn)行結(jié)果輸出如下:直角坐標(biāo)x=3直角坐標(biāo)y=5math庫(kù)函數(shù)r=5.830951894845301math庫(kù)函數(shù)theta=59.03624346792648OpenCV庫(kù)函數(shù)r=[[5.8309517]]OpenCV庫(kù)函數(shù)thetar=[[59.039936]]極坐標(biāo)變?yōu)橹苯亲鴺?biāo)x=[3.]極坐標(biāo)變?yōu)橹苯亲鴺?biāo)y=[5.]dst=cv2.LogPolar(src,center,M,intflags=CV2_INTER_LINEAR+CV2_WARP_FILL_OUTLIERS)其中輸入輸出參數(shù)為:dst:直角坐標(biāo)變換后輸出圖像,與原圖像具有相同的數(shù)據(jù)類型和通道數(shù);src:原圖像,可以是灰度圖像或者彩色圖像;center:直角坐標(biāo)變換時(shí)直角坐標(biāo)的原點(diǎn)坐標(biāo);M:幅度比例參數(shù);flags:插值方法。CV_WARP_FILL_OUTLIERS表示填充所有目標(biāo)圖像像素。OpenCV直角坐標(biāo)系轉(zhuǎn)換為極坐標(biāo)系有2個(gè)函數(shù):其一是cv2.logPolar函數(shù)是把數(shù)據(jù)從直角坐標(biāo)系轉(zhuǎn)到對(duì)數(shù)極坐標(biāo)系,其二是cv2.linearPolar函數(shù)把數(shù)據(jù)從直角坐標(biāo)系轉(zhuǎn)到線性極坐標(biāo)系。其中cv2.logPolar直角坐標(biāo)系轉(zhuǎn)換為極坐標(biāo)系函數(shù)語法格式為:3.7.2圖像數(shù)據(jù)坐標(biāo)系間的轉(zhuǎn)換【例3.12】圖像數(shù)據(jù)由直角坐標(biāo)向極坐標(biāo)的轉(zhuǎn)換。程序代碼如下:importcv2importmathimg=cv2.imread('d:/pics/clock.jpg')h,w=img.shape[0:2]maxRadius=math.hypot(w/2,h/2)m=w/math.log(maxRadius)log_polar=cv2.logPolar(img,(w/2,h/2),m,cv2.WARP_FILL_OUTLIERS+cv2.INTER_LINEAR)linear_polar=cv2.linearPolar(img,(w/2,h/2),m,cv2.WARP_FILL_OUTLIERS+cv2.INTER_LINEAR)dst=cv2.transpose(log_polar)#圖像轉(zhuǎn)置dst=cv2.flip(dst,0)#圖像垂直鏡像lin_dst=cv2.transpose(linear_polar)#圖像轉(zhuǎn)置lin_dst=cv2.flip(lin_dst,0)#圖像垂直鏡像cv2.imshow("Original",img)cv2.imshow("Log_polar",log_dst)cv2.imshow("Linear_polar",lin_dst)cv2.waitKey(0)cv2.destroyAllWindows()圖(a)為直角坐標(biāo)系的鐘表,圖(b)為對(duì)數(shù)極坐標(biāo)系鐘表,圖(c)為線性極坐標(biāo)系的鐘表。(a)
(b)
(c)dst=cv2.warpPolar(src,dsize,center,maxRadius,flags)其中輸出、輸入?yún)?shù)為:dst:極坐標(biāo)變換后輸出圖像,與原圖像具有相同的數(shù)據(jù)類型和通道數(shù);src:原圖像,可以是灰度圖像或者彩色圖像;dsize:輸出圖像的尺寸;center:極坐標(biāo)變換時(shí)極坐標(biāo)的原點(diǎn)坐標(biāo);maxRadius:變換時(shí)邊界圓的半徑,它也決定了逆變換時(shí)的比例參數(shù);flags:插值方法與極坐標(biāo)映射方法標(biāo)志,如表所示。在OpenCV庫(kù)中提供了實(shí)現(xiàn)圖像極坐標(biāo)變換的函數(shù)cv2.warpPolar,它的語法格式是:3
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版舊車買賣合同包含車輛過戶手續(xù)辦理3篇
- 2025版智能小區(qū)監(jiān)控平臺(tái)建設(shè)與運(yùn)營(yíng)維護(hù)合同3篇
- 2025年度船舶港口清潔與消毒服務(wù)合同3篇
- 2025年度居民用水行業(yè)發(fā)展規(guī)劃合同示范3篇
- 2024全新電力系統(tǒng)保護(hù)用機(jī)電產(chǎn)品買賣協(xié)議3篇
- 2024年版權(quán)許可使用合同中的權(quán)利義務(wù)規(guī)定
- 2025版鋼筋混凝土排水管系統(tǒng)集成與智能化升級(jí)合同3篇
- 2024年牧場(chǎng)草地修復(fù)與購(gòu)買合同
- 2025版駕校經(jīng)營(yíng)權(quán)創(chuàng)新發(fā)展承包合同
- 2025版城市公交客車租賃協(xié)議書3篇
- 初二年級(jí)勞動(dòng)課教案6篇
- 箱變遷移工程施工方案
- 北師大版九年級(jí)數(shù)學(xué)下冊(cè)《圓的對(duì)稱性》評(píng)課稿
- 住宅室內(nèi)裝飾裝修管理辦法課件
- 呼吸系統(tǒng)疾病診療規(guī)范
- 《遙感原理與應(yīng)用》期末考試試卷附答案
- 2023年全國(guó)乙卷筆試部分講解課件 【高效課堂+精研精講】 高考英語復(fù)習(xí)
- GB/T 9452-2023熱處理爐有效加熱區(qū)測(cè)定方法
- 肺炎支原體肺炎診治專家共識(shí)
- 酒店業(yè)輕資產(chǎn)運(yùn)營(yíng)模式案例研究
- 建筑師《建筑工程經(jīng)濟(jì)》習(xí)題(E)
評(píng)論
0/150
提交評(píng)論