• 图像处理之径向裁剪


    1 圆形径向裁剪

           图像处理中对于鱼眼镜头获取的sensor图像是圆形,后端ISP处理中Drc、gamma、Y域对比度拉伸等模块会将圆形周边的亮度拉亮,或者色彩发生改变,从而影响鱼眼图像整体效果,尤其针对多帧拼接时影响会更大。因此,通常会采用径向裁剪的方式,

    保留有效区域图像,将非有效区图像进行透明化或者拉黑。

    2 径向裁剪实现(python+opencv)

           圆形径向裁剪代码实现如下,该代码实现非有效区域透明化处理。

     1 #coding:utf8
     2 
     3 import numpy as np
     4 import cv2
     5 from matplotlib import pyplot as plt
     6 import glob as gb
     7 
     8 # 图像处理,获取图片最大内接圆,其他区域置为透明
     9 def img_deal(input_img):
    10     # cv2.IMREAD_COLOR,读取BGR通道数值,即彩色通道,该参数为函数默认值
    11     # cv2.IMREAD_UNCHANGED,读取透明(alpha)通道数值
    12     # cv2.IMREAD_ANYDEPTH,读取灰色图,返回矩阵是两维的
    13     img = cv2.imread(input_img, cv2.IMREAD_UNCHANGED)
    14     rows, cols, channel = img.shape
    15 
    16     # 创建一张4通道的新图片,包含透明通道,初始化是透明的
    17     img_new = np.zeros((rows,cols,4),np.uint8)
    18     img_new[:,:,0:3] = img[:,:,0:3]
    19 
    20     # 创建一张单通道的图片,设置最大内接圆为不透明,注意圆心的坐标设置,cols是x坐标,rows是y坐标
    21     img_circle = np.zeros((rows,cols,1),np.uint8)
    22     img_circle[:,:,:] = 0  # 设置为全透明
    23     img_circle = cv2.circle(img_circle,(cols/2,rows/2),min(rows, cols)/2,(255),-1) # 设置最大内接圆为不透明
    24 
    25     # 图片融合
    26     img_new[:,:,3] = img_circle[:,:,0]
    27 
    28     # 保存图片
    29     cv2.imwrite(input_img+".png", img_new)
    30     # cv2.imencode('.jpg', img)[1].tofile('./9.jpg')  # 保存到另外的位置
    31 
    32     # 显示图片,调用opencv展示
    33     # cv2.imshow("img_new", img_new)
    34     # cv2.waitKey(0)
    35     # cv2.destroyAllWindows()
    36 
    37     # 显示图片,调用matplotlib.pyplot展示
    38     plt.subplot(121), plt.imshow(img_convert(img), cmap='gray'), plt.title('IMG')
    39     plt.subplot(122), plt.imshow(img_convert(img_new), cmap='gray'), plt.title('IMG_NEW')
    40     plt.show()
    41 
    42 # cv2与matplotlib的图像转换,cv2是bgr格式,matplotlib是rgb格式
    43 def img_convert(cv2_img):
    44     # 灰度图片直接返回
    45     if len(cv2_img.shape) == 2:
    46         return cv2_img
    47     # 3通道的BGR图片
    48     elif len(cv2_img.shape) == 3 and cv2_img.shape[2] == 3:
    49         b, g, r = cv2.split(cv2_img)
    50         return cv2.merge((r, g, b))
    51     # 4通道的BGR图片
    52     elif len(cv2_img.shape) == 3 and cv2_img.shape[2] == 4:
    53         b, g, r, a = cv2.split(cv2_img)
    54         return cv2.merge((r, g, b, a))
    55     # 未知图片格式
    56     else:
    57         return cv2_img
    58 
    59 # 主函数
    60 if __name__ == "__main__":
    61     img_path = gb.glob("img/*")
    62     for path in img_path:
    63         print path
    64         img_deal(path)

             仿真效果如下:

      

          

  • 相关阅读:
    内置的包装类
    子类继承父类的哪些成员
    JAVA笔记140-使用this语句解决构造器重载相互调用问题
    Java学习
    AngularJs2
    Angular
    检测是否所有的栏位都已经填充了内容了。(可以用来判断动态放置的东西和外加的框是否一致)
    上下各有一个框,框里有元素(点击下面的元素,显示到上面的框里面去,按一定顺序排放)
    Nashorn 在JDK 8中融合Java与JavaScript之力
    2014年Facebook的开源成就
  • 原文地址:https://www.cnblogs.com/qiqibaby/p/8626687.html
Copyright © 2020-2023  润新知