图像处理之径向裁剪

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)

         仿真效果如下:

  

 

      

posted @ 2018-03-22 21:06  淇淇宝贝  阅读(1183)  评论(0编辑  收藏  举报