OpenCV学习笔记之三:图像基本操作

ぃ、小莉子 提交于 2020-01-01 05:01:52

首先,学习图像处理需要用到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)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!