Python多张单通道(少通道)图合成多通道图
前言
在深度学习种我们常常需要对图片进行处理,可能会有亮度、对比度、剪切、图片大小、添加标注框等的处理,今天我们进行对图片的合成,以及我在通道合成中里遇到的一些问题。通过对图片的预处理我们可以得到更多版本的数据,便于我们对数据的训练。
如何操作
我们在这里用到的主要是Opencv2之cv2函数对图片进行处理。首先,我们需要对我们本地的图片进行读取。这里我们用到cv2.imread函数,实例方法如下
import cv2
img = cv2.imread('cat.png')
print(img)#这里的print的作用是便于让我们看到cv2.imread读取到的是什么格式。
运行之后我们发现cv2.imread读取到的是图片的矩阵格式。
再此之后我们对图片进行融合,融合我们用到的函数是cv2.merge,实例方法如下。
import cv2
img1 = cv2.imread('cat1.png')
img2 = cv2.imread('cat2.png')
img3 = cv2.imread('cat3.png')
res = cv2.merge([img1, img2, img3])
print(res)#这里的print的作用是便于让我们看到cv2.merge合成的是什么格式。
在我们合成图片完成之后我们需要对图片进行一个保存,以达到我们的最终目的~得到所合成的图片。
保存图片我们用到的是cv2.imwrite函数,实例方法入下
import cv2
img1 = cv2.imread('cat1.png')
img2 = cv2.imread('cat2.png')
img3 = cv2.imread('cat3.png')
res = cv2.merge([img1, img2, img3])
cv2.imwrite('cat.png',res)
这样我们就把三张通道的图片进行了通道的合成。
如果我们的原始图片就是三通道,这样三张图片合成后我们的图片就会成为九通道。如果需要将原始的三通道转化为单通道就要用到cv2.split函数,对图片进行分离,实例如下:
import cv2
img1 = cv2.imread('cat1.png')
img2 = cv2.imread('cat2.png')
img3 = cv2.imread('cat3.png')
r_1, b_1, g_1 = cv2.split(img1)#这里需要知道的是split是按照RBG进行通道的分离
r_2, b_2, g_2 = cv2.split(img2)#如果原来的图像没有三通道,则不能够按照这样进行分离
#会报错提示too many values to unpack (expected x)
r_3, b_3, g_3 = cv2.split(img3)#若是九通道则可以按照这样进行分离
res = cv2.merge([r_1, g_2, b_3])
cv2.imwrite('cat.png',res)
在操作中遇到的一些问题
- 在操作中起初用到的是cv2.add函数,导致最后处理得到的图片过亮,这是因为add函数是对图片的叠加,而不是对图片通道的融合。(在后面整理了cv2库中的常用的函数)
- 需要用到的对全部文件的处理,循环结构未能做好。
cv2库中的常用函数以及作用
1、 cv2.imread():读入图片,共两个参数,第一个参数为要读入的图片文件名,第二个参数为如何读取图片,包括
cv2.IMREAD_COLOR:读入一副彩色图片;cv2.IMREAD_GRAYSCALE:以灰度模式读入图片;cv2.IMREAD_UNCHANGED:读入一幅图片,并包括其alpha通道。
PS:调用opencv,就算图像的路径是错的,OpenCV 也不会提醒你的,但是当你使用命
令print(img)时得到的结果是None。
2、cv2.imshow():创建一个窗口显示图片,共两个参数,第一个参数表示窗口名字,可以创建多个窗口中,但是每个窗口不能重名;第二个参数是读入的图片,窗口大小自动调整为图片大小。
3、cv2.waitKey():键盘绑定函数,共一个参数,表示等待毫秒数,将等待特定的几毫秒,看键盘是否有输入,返回值为ASCII值。如果其参数为0,则表示无限期的等待键盘输入。
4、cv2.destroyAllWindows():删除建立的全部窗口。
5、cv2.destroyWindows():删除指定的窗口。
6、cv2.imwrite(file,img,num):保存图片,共3个参数,第一个为保存文件名,第二个为读入图片,可选的第三个参数,它针对特定的格式:对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95;对于png ,第三个参数表示的是压缩级别。默认为3.
7、使用函数cv2.flip(img,flipcode)翻转图像,flipcode控制翻转效果。
flipcode = 0:沿x轴翻转 flipcode > 0:沿y轴翻转 flipcode < 0:x,y轴同时翻转
imgflip = cv2.flip(img,1)
8、复制图像
imgcopy = img.copy()
9、颜色空间转换
#彩色图像转为灰度图像
img2 = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
灰度图像转为彩色图像
img3 = cv2.cvtColor(img,cv2.COLOR_GRAY2RGB)
10、读入一副图像,给图片加文本
import cv2
# img=cv2.imread('cat.jpg',cv2.IMREAD_COLOR)
img=cv2.imread('cat.png',cv2.IMREAD_COLOR) # 打开文件
font = cv2.FONT_HERSHEY_DUPLEX # 设置字体
# 图片对象、文本、像素、字体、字体大小、颜色、字体粗细
imgzi = cv2.putText(img, "words", (1100, 1164), font, 5.5, (0, 0, 0), 2,)
# cv2.imshow('lena',img)
cv2.imwrite('5.png',img) # 写磁盘
cv2.destroyAllWindows() # 毁掉所有窗口
cv2.destroyWindow(wname) # 销毁指定窗口
11、配合画图
import numpy as np
import cv2
np.set_printoptions(threshold='nan')
# 创建一个宽512高512的黑色画布,RGB(0,0,0)即黑色
img=np.zeros((512,512,3),np.uint8)
# 画直线,图片对象,起始坐标(x轴,y轴),结束坐标,颜色,宽度
cv2.line(img,(0,0),(311,511),(255,0,0),10)
# 画矩形,图片对象,左上角坐标,右下角坐标,颜色,宽度
cv2.rectangle(img,(30,166),(130,266),(0,255,0),3)
# 画圆形,图片对象,中心点坐标,半径大小,颜色,宽度
cv2.circle(img,(222,222),50,(255.111,111),-1)
# 画椭圆形,图片对象,中心点坐标,长短轴,顺时针旋转度数,开始角度(右长轴表0度,上短轴表270度),颜色,宽度
cv2.ellipse(img,(333,333),(50,20),0,0,150,(255,222,222),-1)
# 画多边形,指定各个点坐标,array必须是int32类型
pts=np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
# -1表示该纬度靠后面的纬度自动计算出来,实际上是4
pts = pts.reshape((-1,1,2,))
# print(pts)
# 画多条线,False表不闭合,True表示闭合,闭合即多边形
cv2.polylines(img,[pts],True,(255,255,0),5)
#写字,字体选择
font=cv2.FONT_HERSHEY_SCRIPT_COMPLEX
# 图片对象,要写的内容,左边距,字的底部到画布上端的距离,字体,大小,颜色,粗细
cv2.putText(img,"words",(10,400),font,3.5,(255,255,255),2)
a=cv2.imwrite("cat.jpg",img)
cv2.imshow("cat",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.putText(img,"words",(10,400),font,3.5,(255,255,255),2)
a=cv2.imwrite("cat.jpg",img)
cv2.imshow("cat",img)
cv2.waitKey(0)
cv2.destroyAllWindows()