opencv获取不规则图像

        当我们在截取我们所想要的图像中,往往采用矩形很难达到我们所希望的结果,大多数我们所希望截取的图像形状是不规则的。在opencv中支持不规则图像的填充,而我们希望的往往是不规则图像的获取与不规则图像外部的填充。

思想:

       作者通过制作图像的掩码,利用矩阵的点乘,反向对图像进行填充,从而获取所需要的不规则图像。

算法如下:

import cv2
import numpy as np
from copy import deepcopy
from PIL import Image


def Imgcutout(Image):
    # Image is the original
    # Image的格式可以为PIL格式,也可以为numpy格式(cv2导入)

    # 如果是PIL格式导入,不需要注释下两行,如果是cv2导入,需要注释以下两行 
    Image_ = np.array(Image_)
    Image_ = cv2.cvtColor(Image_,cv2.COLOR_RGB2BGR)

    # 对图像进行深拷贝,因为要复用图像的信息
    img_deepcope = deepcopy(Image_)
    
    # Cutout key points 
    # 所有关键点均换为数字,而且一定要按顺序的点位进行填写,关键点个数可自行调节
    # 格式为数组格式,例   point = np.array([[10,15],[4,12]],np.int32)
    point = np.array([[x1,y1],[x2,y2],[x3,y3],[x4,y4]], np.int32)

    # Image fill
    img_fill = cv2.fillPoly(Image_, [point], color=(255, 255, 255))

    # Remove common parts
    img_com = cv2.subtract(img_fill, img_deepcope)

    # Convert the image back to grayscale for easy access to binary images
    # 将图像由3维彩色图转化为1维的灰度图
    img_com = cv2.cvtColor(img_com, cv2.COLOR_BGR2GRAY)
    img_bin = np.where(img_com > 0, 1, 0)

    # Upscaling a 2D image
    img_bin = np.expand_dims(img_bin, axis=2)

    # Merge images
    img_merge = np.concatenate([img_bin, img_bin, img_bin], axis=2)

    # Get fill image
    img_ = np.multiply(img_merge, img_deepcope)
    img_ = np.array(img_, dtype=np.uint8)

    # cv to PIL
    # 如果是PIL格式输出,不需要注释下两行,如果是cv2输出,需要注释以下两行
    img_ = cv2.cvtColor(img_,cv2.COLOR_BGR2RGB)
    img_ = Image.fromarray(img_)

    return img_

if __name__ == "__main__":
    Image = Image.open("图像绝对地址")
    img = Imgcutout(Image)
    img.show()
 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值