• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    python四个坐标点对图片区域最小外接矩形进行裁剪
    POST TIME:2021-10-18 13:38

    在图像裁剪操作中,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.pi
          valuex = np.array(valuex)
          valuey = np.array(valuey)
          nRotatex = (valuex-pointx)*math.cos(angle) - (valuey-pointy)*math.sin(angle) + pointx
          nRotatey = (valuex-pointx)*math.sin(angle) + (valuey-pointy)*math.cos(angle) + pointy
          return (nRotatex, nRotatey)
    #顺时针旋转
    def Srotate(angle,valuex,valuey,pointx,pointy):
          angle = (angle/180)*math.pi
          valuex = np.array(valuex)
          valuey = np.array(valuey)
          sRotatex = (valuex-pointx)*math.cos(angle) + (valuey-pointy)*math.sin(angle) + pointx
          sRotatey = (valuey-pointy)*math.cos(angle) - (valuex-pointx)*math.sin(angle) + pointy
          return (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四个坐标点对图片区域最小外接矩形进行裁剪的文章就介绍到这了,更多相关python 图片坐标裁剪内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Python图片裁剪实例代码(如头像裁剪)
    • python实现自动网页截图并裁剪图片
    • Python实现图片裁剪的两种方式(Pillow和OpenCV)
    • python实现对图片进行旋转,放缩,裁剪的功能
    • python通过opencv实现图片裁剪原理解析
    • python opencv对图像进行旋转且不裁剪图片的实现方法
    • Python OpenCV实现裁剪并保存图片
    上一篇:Python OpenCV 图像平移的实现示例
    下一篇:拒绝盗图!教你怎么用python给图片加水印
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信