python利用四个坐标点对图片目标区域最小外接矩形进行裁剪
生活随笔
收集整理的這篇文章主要介紹了
python利用四个坐标点对图片目标区域最小外接矩形进行裁剪
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在圖像裁剪操作中,opencv和pillow兩個庫都具有相應的函數,但是這兩個庫中的函數僅僅能對與圖片平行的矩形進行裁剪操作,如果想要對目標的最小外接矩形進行裁剪該如何操作呢?如下所示:
具體處理該問題的思路如下:
圖像原圖如下:
1 求出該區域的最小外接矩形,并且得到外接矩形的四個點的坐標和旋轉角度。
rect = cv2.minAreaRect(self.contours[0])#rect為[(旋轉中心x坐標,旋轉中心y坐標),(矩形長,矩形寬),旋轉角度] box_origin = cv2.boxPoints(rect)#box_origin為[(x0,y0),(x1,y1),(x2,y2),(x3,y3)]2 將原圖像進行旋轉,旋轉角度為最小外接矩形的角度,由于防止旋轉后目標區域在圖像外面,所以我將圖像大小擴大為原來的2倍。
M = cv2.getRotationMatrix2D(rect[0],rect[2],1) dst = cv2.warpAffine(rotateimg,M,(2*rotateimg.shape[0],2*rotateimg.shape[1]))3 將原四個點的坐標做映射,映射到旋轉后的區域,得到新的四個點的坐標。
#逆時針旋轉 def Nrotate(angle,valuex,valuey,pointx,pointy):angle = (angle/180)*math.pivaluex = np.array(valuex)valuey = np.array(valuey)nRotatex = (valuex-pointx)*math.cos(angle) - (valuey-pointy)*math.sin(angle) + pointxnRotatey = (valuex-pointx)*math.sin(angle) + (valuey-pointy)*math.cos(angle) + pointyreturn (nRotatex, nRotatey) #順時針旋轉 def Srotate(angle,valuex,valuey,pointx,pointy):angle = (angle/180)*math.pivaluex = np.array(valuex)valuey = np.array(valuey)sRotatex = (valuex-pointx)*math.cos(angle) + (valuey-pointy)*math.sin(angle) + pointxsRotatey = (valuey-pointy)*math.cos(angle) - (valuex-pointx)*math.sin(angle) + pointyreturn (sRotatex,sRotatey) #將四個點做映射 def rotatecordiate(angle,rectboxs,pointx,pointy):output = []for rectbox in rectboxs:if angle>0:output.append(Srotate(angle,rectbox[0],rectbox[1],pointx,pointy))else:output.append(Nrotate(-angle,rectbox[0],rectbox[1],pointx,pointy))return output box = rotatecordiate(rect[2],box_origin,rect[0][0],rect[0][1])4 利用四個點坐標進行裁剪,如2中圖所示,圖像經過旋轉后已經變為和圖片沒有旋轉角的圖像,經過實驗觀察旋轉后的坐標還是有細微差別,但誤差已經在千分點甚至萬分點左右,對我們裁剪造成的影響可以忽略不計。
def imagecrop(image,box):xs = [x[1] for x in box]ys = [x[0] for x in box]print(xs)print(min(xs),max(xs),min(ys),max(ys))cropimage = image[min(xs):max(xs),min(ys):max(ys)]print(cropimage.shape)cv2.imwrite('cropimage.png',cropimage)return cropimage imagecrop(dst,np.int0(box))到此,利用4個坐標點對圖像進行裁剪操作已經完成。
總結
以上是生活随笔為你收集整理的python利用四个坐标点对图片目标区域最小外接矩形进行裁剪的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java多线程之Thread-Speci
- 下一篇: 【 C++ OpenCV画旋转矩形