Python-opencv-学习笔记(1)-图像基本操作
程序员文章站
2022-03-05 15:00:36
...
图像基本操作
数据读取-图
转换为灰度图的不同方式
- img_gray = cv2.imread(’…/…/pic/cat.jpg’, cv2.IMREAD_GRAYSCALE)
- img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
相对路径
“/” :表示根目录,在windows系统下表示某个盘的根目录,如“E:\”;
“./”:表示当前目录;(表示当前目录时,也可以去掉“./”,直接写文件名或者下级目录)
“…/”:表示上级目录
img = cv2.imread('../../pic/cat.jpg')
cv2.imshow('cat', img)
img_gray = cv2.imread('../../pic/cat.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('cat_gray', img_gray)
img_gray2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('cat_gray2', img_gray2)
print(img.shape)
cv2.waitKey(0) # 按任意键退出显示
cv2.destroyAllWindows()
printf(Img.shape)
# OUT: (414, 500, 3)
# 图像保存
cv2.imwrite('mycat.jpg',img)
数据读取-视视频
def show_video():
vc = cv2.VideoCapture('../../pic/test.mp4')
# 检查能否正确打开
if vc.isOpened():
ret_val, frame1 = vc.read()
else:
ret_val = False
while ret_val:
ret, frame = vc.read()
if frame is None:
break
if ret is True:
cv2.imshow('result', frame)
# 等待或者按退出键退出
if cv2.waitKey(120) & 0xff == 27:
break
vc.release()
cv2.destroyAllWindows()
如果想要显示电脑内置摄像头的视频,只需要把 vc = cv2.VideoCapture(’…/…/pic/test.mp4’) 改为
vc = cv2.VideoCapture(0) 既可。
关于wait_key()
- wait_key(10) 表示等待10ms后关闭
- wait_key(0) 表示始终显示
ROI (Region of interst)-截去部分图像数据
img = cv2.imread('cat.jpg')
cat = img[0:200,0:200]
cv_show('cat',cat)
改变图像的大小
# 将img的图像变为30✕30
img_small = cv2.resize(img,(30,30))
# 将img的图像沿x方向扩大3倍,y方向不变
img_big = cv2.resize(img,(0,0),fx=3,fy=1)
简单的图像融合
res = addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)
cat = cv2.imread('../../pic/cat.jpg')
dog = cv2.imread('../../pic/dog.jpg')
# 对图像进行尺寸的调整
cat = cv2.resize(cat, (300, 300))
dog = cv2.resize(dog, (300, 300))
# 以一定的比例进行加和
res = cv2.addWeighted(cat, 0.6, dog, 0.5, 0)
cv2.imshow('cat + dog', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
颜色通道截取
b,g,r = cv2.split(img)
#or
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]
note: opencv中的颜色通道顺序为B,G,R,而不是我们通常所说的RGB
边界填充
copyMakeBorder(src, top, bottom, left, right, borderType, dst=None, value=None)
borderType:扩充边缘的类型, OpenCV 中给出以下几种方式 :
- BORDER_REPLICATE 复制法,复制最边缘的像素,例如:aaaa|abcdefg|ggggg
- BORDER_REFLECT 反射法,即以最边缘的像素为对称轴。例如:fedcba|abcdefg|gfedec
- BORDER_REFLECT_101 反射法,也是最边缘的像素为对称轴,但与BORDER_REFLECT有区别。例如:fedcb|abcdefg|fedec
- 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,boarderType=cv2.BORDER_REPLICATE)
constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,boarderType=cv2.BORDER_CONSTANT,value=0)