1 图像基本操作

2022-08-09,

#环境为anaconda3+pyhton3.6+cv2+pycharm

数据读取-图像
cv2.IMREAD_COLOR:彩色图像
cv2.IMREAD_GRAYSCALE:灰度图像

import cv2 #opencv读取的格式是BGR  正常为RGB
import matplotlib.pyplot as plt
import numpy as np 
%matplotlib inline
#图像的显示,也可以创建多个窗口
def cv_show(name,img):#图像显示函数
    cv2.imshow(name,img) #图像的显示,也可以创建多个窗口
    cv2.waitKey(0) # 等待时间,毫秒级,0表示任意键终止
    cv2.destroyAllWindows()

#保存
cv2.imwrite('mycat.png',img)

图像转换为灰色:img=cv2.imread(‘cat.jpg’,cv2.IMREAD_GRAYSCALE)

数据读取-视频
cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。
如果是视频文件,直接指定好路径即可。 cv.read()按帧读取视频,ret,frame是获cv.read()方法的两个返回值。其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。

vc = cv2.VideoCapture('test.mp4')
# 检查是否打开正确
if vc.isOpened(): 
    oepn, frame = vc.read()
else:
    open = False
while open:
    ret, frame = vc.read()
    if frame is None:
        break
    if ret == True:
        gray = cv2.cvtColor(frame,  cv2.COLOR_BGR2GRAY)//BGR和灰度图的转换使用 cv2.COLOR_BGR2GRAY
        cv2.imshow('result', gray)
        if cv2.waitKey(100) & 0xFF == 27:#27代表esc
            break
vc.release()
cv2.destroyAllWindows()
    

截取部分图像数据

img=cv2.imread('cat.jpg')
cat=img[0:50,0:200] 
cv_show('cat',cat)

颜色通道提取

b,g,r=cv2.split(img)
r
array([[160, 164, 169, ..., 185, 184, 183],
       [126, 131, 136, ..., 184, 183, 182],
       [127, 131, 137, ..., 183, 182, 181],
       ...,
       [198, 193, 178, ..., 206, 195, 174],
       [176, 183, 175, ..., 188, 144, 125],
       [190, 190, 157, ..., 200, 145, 144]], dtype=uint8
       
 # 只保留R
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,1] = 0
cv_show('R',cur_img)
# 只保留G
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,2] = 0
cv_show('G',cur_img)

边界填充:类似于pool层
BORDER_REPLICATE:复制法,也就是复制最边缘像素。
BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg
BORDER_CONSTANT:常量法,常数值填充。

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,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0)

import matplotlib.pyplot as plt
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()

图像融合
:图片直接相加,超过256的数值,相当于% 256

img_cat=cv2.imread('cat.jpg')#(414, 500, 3)
img_dog=cv2.imread('dog.jpg')#(414, 400, 3)
img_dog = cv2.resize(img_dog, (500, 414))#转换为同一尺度  (414, 500, 3)
res = cv2.addWeighted(img_cat, 0.4, img_dog, 0.6, 0)#按一定权重相加

改变图像形状

res = cv2.resize(img, (0, 0), fx=4, fy=4)# x,y都乘以4
plt.imshow(res)

本文地址:https://blog.csdn.net/julinglan7642/article/details/107149514

《1 图像基本操作.doc》

下载本文的Word格式文档,以方便收藏与打印。