首先,学习图像处理需要用到Python的两个库,在Pycharm的终端里安装以下两个库:
注意:安装特定版本的库时,在后面用==接要安装的版本号
pip install opencv-python==3.4.1.15
pip install opencv-contrib-python==3.4.1.15
计算机中一个像素点事从0-255表示亮度,255最亮表示白色,0表示黑色。RGB是三维数据矩阵表示一个图片的所有像素点组成。
图像-->500x500x3(3:RGB) 在每个颜色通道上都有1个500x500的矩阵。
一、数据读取-图像
cv2.IMREAD_COLOR:彩色图像
img = cv2.imread(r'.\jay1.jpg')
cv2.IMREAD_GRAYSCALE:灰度图像
img = cv2.imread('jay1.jpg',cv2.IMREAD_GRAYSCALE) #图像进行灰度处理,灰度图进行预处理操作
二、数据读取-视频
cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。
如果是视频文件,直接指定好路径即可。
#视频显示
vc = cv2.VideoCapture('test.mp4') #参数是要读取的视频
#检查是否打开正确
if vc.isOpened():
oepn, frame = vc.read() #把视频拆成帧, frame是当前一帧的图像
else:
open = False
while open:
ret, frame = vc.read()
if frame is None: #读取每帧,如果不为空就继续执行,否则跳出
break
if ret == True:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #每帧转成灰度图
cv2.imshow('result', gray) #灰度显示
if cv2.waitKey(10) & 0xFF == 27: #27是退出键
break
vc.release()
cv2.destroyAllWindows()
三、截取部分
读取图片img=cv2.imread('cat.jpg')
设置要裁剪的区域cat=img[0:50,0:200]
显示图片cv_show('cat',cat)
四、颜色通道提取
首先颜色通道的先后顺序是BGR,而不是RGB。BGR->(0,1,2)
若保留R,需要把G,B全部设置为0
若保留G,需要把R,B全部设置为0
若保留B,需要把R,G全部设置为0
#颜色通道提取
img = cv2.imread(r'.\jay1.jpg')
b,g,r=cv2.split(img) #注意顺序是BGR,而不是RGB
print(b) #显示b颜色通道像素点
print(g) #显示g颜色通道像素点
print(r) #显示r颜色通道像素点
print(r.shape) #显示r颜色通道大小
img = cv2.merge((b,g,r)) #注意顺序是BGR,而不是RGB,另外颜色通道需要用元组作为参数
print(img.shape)
#(b,g,r) -> (0,1,2)
# 只保留R,其他通道置为0
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,1] = 0
cv_show('R',cur_img)
# 只保留G,其他通道置为0
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,2] = 0
cv_show('G',cur_img)
# 只保留B,其他通道置为0
cur_img = img.copy()
cur_img[:,:,1] = 0
cur_img[:,:,2] = 0
cv_show('B',cur_img)
五、边界填充
边界填充形象理解就是对原始图片加一个边框,如下图所示:
边界填充都是用同一个函数cv2.copyMakeBorder(image,top_size,bottom_size,left_size,right_size,border_type)。
#边界填充
top_size,bottom_size,left_size,right_size = (50,50,50,50)
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,borderType=cv2.BORDER_CONSTANT, value=0)
plt.subplot(231), plt.imshow(img, 'gray'), plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')
plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101')
plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')
plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT')
plt.show()
BoderType的属性见下图
六、数值计算
图像的像素相加,必须满足维度是一样的。
如果是两张图相加img1+img2,则超过255的需要转换(用和求余256)
如果是用add函数相加的话,超过255的直接保持最大的255
#数值计算
img_jay1=cv2.imread(r'jay1.jpg')
img_jay12= img_jay1 +10
print(img_jay1[:5,:,0]) #打印原图像素
print(img_jay12[:5,:,0])#打印像素+10后图片的像素
print((img_jay1+img_jay12)[:5,:,0]) #两图相加后的像素 超过255执行%256
img_add = cv2.add(img_jay1,img_jay12)[:5,:,0] #两图相加后的像素 超过255则保持255
print(img_add)
七、图像融合
如果直接把两张图片相加,必须满足两张图片的大小一致。
cv2.resize(image,(width,height))注意width在前,height在后
img_heart=cv2.resize(img_heart,(500,546))#先w再h
同比例缩放图片,也可以单独只放大宽或者高
#同比例放大四倍
res = cv2.resize(img_jay1, (0,0), fx =4, fy=4)
cv_show('img_p1',res)
#宽度保持不变,高度放大三倍
res = cv2.resize(img_jay1, (0,0), fx =1, fy=3)
cv_show('img_p3',res)
两张图片融合需要符合一个公式: R=alpha * x1 + beta * x2 + b 其中alpha--x1的权重,beta--x2的权重, b--亮度级微调偏置项
#融合公式 R=alpha * x1 + beta * x2 + b (alpha=0.4, beta=0.6, b=0) alpha--x1的权重,beta--x2的权重, b--亮度级微调偏置项
img_conj_1 = cv2.addWeighted(img_jay1, 0.4, img_heart, 0.6, 0)
cv_show('img_conj',img_conj_1)