openCV 图像的基本操作 学习回顾记录
Posted 深度菜鸡-达闻西
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了openCV 图像的基本操作 学习回顾记录相关的知识,希望对你有一定的参考价值。
文章目录
图像基本操作
一、图像读取
cv2.imread( )
- cv.IMREAD_COLOR:彩色图像
- cv2.IMREAD_GRAYSCALE:灰色图像
- 读取的格式是 BGR
- img.shape H、W、C
import cv2 # opencv 读取格式是 BGR
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('1.jpg')# 读取
img ,img.shape# h,w,c
图片保存
cv2.imwrite("./new_img.jpg",img)
二、图像显示
cv2.imshow('一个人',img) #显示代码
#等待时间,毫秒级别, 0 表示任意键结束
cv2.waitKey(0)
cv2.destroyAllWindows()
# 一个显示函数
def cv_show(name,img):
cv2.imshow("name",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv_show("一个人",img)
读取灰度图像
# 读取灰度图像
img_gray = cv2.imread('1.jpg',cv2.IMREAD_GRAYSCALE)
img_gray,img_gray.shape # 没有通道数了
(array([[ 27, 25, 23, ..., 68, 69, 69],
[ 26, 25, 23, ..., 72, 69, 68],
[ 26, 24, 22, ..., 69, 64, 61],
...,
[136, 138, 141, ..., 154, 152, 150],
[142, 144, 147, ..., 158, 154, 152],
[151, 152, 154, ..., 153, 149, 147]], dtype=uint8), (128, 64))
三、视频读取
- cv2.VideoCapture() 可以捕获摄像头,用数字来控制不同的设备,例如 0,1。
- 如果是视频文件,直接定好路径即可。
- cv2.cvtColor(p1,p2) 是颜色空间转换函数,p1是需要转换的图片,p2是转换成何种格式
- cv2.COLOR_BGR2RGB 将BGR格式转换成RGB格式; cv2.COLOR_BGR2GRAY 将BGR格式转换成灰度图片
vc = cv2.VideoCapture('video.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:
img = frame# 可以选择 rgb
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#可以选择播放 灰度图
#cv2.cvtColor(p1,p2) 是颜色空间转换函数,p1是需要转换的图片,p2是转换成何种格式
#cv2.COLOR_BGR2RGB 将BGR格式转换成RGB格式; cv2.COLOR_BGR2GRAY 将BGR格式转换成灰度图片
cv2.imshow("result",img)
if cv2.waitKey(30) & 0xFF ==27:
break
vc.release()
cv2.destroyAllWindows()
四、 截取部分图像数据
img = cv2.imread('beauty.jpg')
cat = img[0:200,0:200] #截取固定大小
cv_show("cat",cat)
五、 颜色单通道提取
split( ) 分割
merge( ) 合并
#split( ) 分割
b,g,r = cv2.split(img)
# merge() 合并
img = cv2.merge((b,g,r))
img.shape #又变成了三通道
# 只保留 R
new_img = img.copy()
new_img[:,:,0]=0 # b,g,r 第0个就是b ,使其为 0
new_img[:,:,1]=0 # b,g,r 第1个就是g, 使其为 0
cv_show("r",new_img)
# 只保留 G
new_img = img.copy()
new_img[:,:,0]=0 # b,g,r
new_img[:,:,2]=0 # b,g,r
cv_show("g",new_img)
# 只保留 B
new_img = img.copy()
new_img[:,:,2]=0 # b,g,r
new_img[:,:,1]=0 # b,g,r
cv_show("b",new_img)
六、 边界填充
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('beauty.jpg')
top_size,bottom_size,left_size,right_size = (300,300,300,300)
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("orginal")
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("reflect101")
plt.subplot(235),plt.imshow(wrap,"gray"),plt.title("wrap")
plt.subplot(236),plt.imshow(constant,"gray"),plt.title("constant")
plt.show()
- cv2.BORDER_REPLICATE: 复制法,复制最边缘像素。
- cv2.BORDER_REFLECT:反射法, 对感兴趣的图像中的像素在两边进行复制,例如:fedcba|abcdefgh|hgfedcb
- cv2.BORDER_REFLECT_101:反射法, 以最边缘像素为轴,对称, gfedcb|abcdefgh|gfedcba
- cv2.BORDER_WRAP: 外包装法,acdefgh|abcdefgh|abcdefg
- cv2.BORDER_CONSTANT: 常量法, 常数值填充。
七、 数值计算
import cv2
img = cv2.imread("1.jpg")
img[:5,:,0]
#out
array([[ 34, 32, 30, 30, 30, 28, 26, 24, 27, 22, 30, 32, 24,
39, 76, 103, 70, 47, 35, 37, 34, 35, 49, 55, 66, 66,
67, 66, 63, 58, 55, 54, 56, 54, 53, 51, 51, 51, 52,
54, 58, 62, 56, 53, 62, 60, 52, 54, 53, 56, 60, 60,
59, 58, 61, 65, 61, 64, 69, 72, 71, 70, 71, 71],
img2 = img+100 # 超过的部分 相对于 256 取余数
img2[:5,:,0]
array([[134, 132, 130, 130, 130, 128, 126, 124, 127, 122, 130, 132, 124,
139, 176, 203, 170, 147, 135, 137, 134, 135, 149, 155, 166, 166,
167, 166, 163, 158, 155, 154, 156, 154, 153, 151, 151, 151, 152,
154, 158, 162, 156, 153, 162, 160, 152, 154, 153, 156, 160, 160,
159, 158, 161, 165, 161, 164, 169, 172, 171, 170, 171, 171],
(img+img2)[:5,:,0] # 超过255 取余数
#out
array([[168, 164, 160, 160, 160, 156, 152, 148, 154, 144, 160, 164, 148,
178, 252, 50, 240, 194, 170, 174, 168, 170, 198, 210, 232, 232,
234, 232, 226, 216, 210, 208, 212, 208, 206, 202, 202, 202, 204,
208, 216, 224, 212, 206, 224, 220, 204, 208, 206, 212, 220, 220,
218, 216, 222, 230, 222, 228, 238, 244, 242, 240, 242, 242],
cv2.add(img,img2)[:5,:,0] # 到达 255 就取值 255
#out
array([[168, 164, 160, 160, 160, 156, 152, 148, 154, 144, 160, 164, 148,
178, 252, 255, 240, 194, 170, 174, 168, 170, 198, 210, 232, 232,
234, 232, 226, 216, 210, 208, 212, 208, 206, 202, 202, 202, 204,
208, 216, 224, 212, 206, 224, 220, 204, 208, 206, 212, 220, 220,
218, 216, 222, 230, 222, 228, 238, 244, 242, 240, 242, 242],
八、 图像融合
import matplotlib.pyplot as plt
import cv2
img = cv2.imread("1.jpg")
img2 = cv2.imread("2.jpg")
plt.subplot(121),plt.imshow(img)
plt.subplot(122),plt.imshow(img2)
plt.show()
# 如果两个图像的大小不一样没办法融合,需要先 resize 大小
img_re = cv2.resize(img,(100,100))## cv resize 图像大小
img_re2 = cv2.resize(img,(100,100))
new_img_img2 = cv2.addWeighted(img,0.5,img2,0.5,0) # k1*x+k2*x+b
plt.imshow(new_img_img2)
plt.show
九、 拉伸
new_img = cv2.resize(img,(0,0),fx=1,fy=3)
plt.imshow(new_img)
plt.show()
new_img = cv2.resize(img,(0,0),fx=3,fy=1)
plt.imshow(new_img)
plt.show()
插值方法
-
INTER_NEAREST - 最近邻插值法
-
INTER_LINEAR - 双线性插值法(默认)
-
INTER_AREA - 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。
-
INTER_CUBIC - 基于4x4像素邻域的3次插值法
-
INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值
img_3 = cv2.resize(img, (0, 0), fx=3, fy=3, interpolation=cv2.INTER_NEAREST)
plt.imshow(img_3)
以上是关于openCV 图像的基本操作 学习回顾记录的主要内容,如果未能解决你的问题,请参考以下文章