图像简单介绍
rgb :光的三原色,也即红绿蓝Red、Green、Blue,它们的最大值是255,相当于100%
hvs:色调(H)饱和度(S)明度(V)
灰度:只有亮度 阈值0~255 0代表暗 255代表亮
H表示图片的宽,W表示图片的高,C表示图片的通道数
rgb是三通道 灰度图是单通道只有亮度
加载图片
第一个代码
import cv2
import matplotlib.pyplot as plt# 导入 maplotlib
img = cv2.imread("D:/23.png")
cv2.imshow('First',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
需要改成你的文件路径和名字和格式
img = cv2.imread("文件路径/名字.格式")
为了方便我定义了一个专门显示的窗口
def cv_show(neme,img):
cv2.imshow(neme,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
我后面调用只需要cv_show()这个函数即可
import cv2
import matplotlib.pyplot as plt# 导入 maplotlib
def cv_show(neme,img):
cv2.imshow(neme,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
return None
img = cv2.imread("D:/23.png")
cv_show('First',img)
print(img.shape)打印加载图片的hwc
print(type(img)) 打印类型
print(img.size) 打印像素点个数
cv2.IMREAD_COLOR:彩色图像
cv2.lMREAD GRAYSCALE:灰度图像
或者0代表灰度 1代表彩色
加载视频
import cv2
video = cv2.VideoCapture("D:/talou.mp4",)
# 检查是否打开正确
if video.isOpened():
# 我们都知道视频和游戏其实都是由图像组成的,通过访问图像的帧数连贯形成的,这里也是一样
# video.read() 一帧一帧地读取
# open 得到的是一个布尔值,就是 True 或者 False
# frame 得到当前这一帧的图像
open, frame = video.read()
else:
open = False
while open:
ret, frame = video.read()
# 如果读到的帧数不为空,那么就继续读取,如果为空,就退出
if frame is None:
break
if ret == True:
# 转换为灰度图
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow("video",gray)
# 这里使用 waitKey 可以控制视频的播放速度,数值越小,播放速度越快
# 这里等于 27 也即是说按下 ESC 键即可退出该窗口
if cv2.waitKey(10) & 0xFF == 27:
break
video.release()
cv2.destroyAllWindows()
原理将视频处理成一帧一帧的图片 逐桢读
图像修剪
用来自瞄中间板块 会经常用到只取图像的一部分
img =img[0:200,0:200] #宽0~200 长0~200的意思
颜色通道提取
B0 G1 R2 python列表
b,g,r =cv2.merge(img)
cat =ing.copy()
cat [:,:,0] =0
cat [:,:,1] =0
边界填充
cv2.copyMakeBorder()函数
top_size,bottom_size,left_size,right_size =(50,50,50,50)
BORDER_REPLICATE:复制法,也就是复制最边缘像素。
BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:
BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,
BORDER_CONSTANT:常量法,常数值填充。
fuzhi =cv2.copyMakeBorder(img,top_size, bottom_size,left_size,right_size,borderType =cv2.BORDER_REPLICATE)
图像融合
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread("./1.jpg")
img_cat = cv.imread("./2.jpg")
# 设置与 img 一样的数值
img_cat = cv.resize(img_cat,(721,300))
# 设置宽度值
res = cv.addWeighted(img,0.4,img_cat,0.6,0)
# 图像显示
plt.imshow(res)
plt.show()
图像阈值
cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取O
cv2.THRESH_BINARY_INV THRESH_BINARY的反转
cv2.THRESH_TRUNC大于阈值部分设为阈值,否则不变
cv2.THRESH_TOZERO大于阈值部分不改变,否则设为0
cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转
ret, thresh = cv.threshold(img, 127, 255, cv.THRESH_BINARY)
图像平滑处理
卷积矩阵
均值滤波
3 5 7一般
blur =cv2.blur(img,(3,3))
平均值
方框滤波
box = cv2.boxFilter(img,-1,(3,3),normalize=True)
和均值滤波一样 normalize=True要做归一化 normalize=False不做归一化(可能越界 越界部分全部为255)
高斯滤波
aussian = cv2.GaussianBlur (img,(5,5),1)
越靠近 像素越重要 权重系数越大
中值滤波
median = cv2.medianBlur (img,5)
5代表5x5 25个值按从小到大排序 取中值13的值
同时展示值
res =np.vstack(?,?,median) cv_show('First',res)
hstack可以改成vstack
形态学—腐蚀操作
kernel = np. ones ((5,5) , np.uint8) erosion = cv2.erode(img, kernel,iterations = 6)
去掉一些细小的特征 会使整张图片变的模糊 (5,5)代表卷积矩阵 iterations = 6代表迭代次数6次
形态学—膨胀操作
kernel = np. ones ((5,5) , np.uint8) dig_dilate = cv2.dilate(erosion, kernel,iterations = 1)
开运算与闭运算
开运算
kernel = np. ones ((5,5) , np.uint8) opening =cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel) cv_show('First',opening) print(img)
闭运算
kernel = np. ones ((5,5) , np.uint8) closing =cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel) cv_show('First',closing) print(img)
开运算 先腐蚀再膨胀 /// 闭运算 先膨胀再腐蚀
梯度运算
kernel = np. ones ((7,7) , np.uint8) gradient =cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel) cv_show('First',gradient)
梯度 =膨胀 -腐蚀
礼帽与黑帽子
kernel = np. ones ((7,7) , np.uint8) tophat =cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel) cv_show('First',tophat)
礼帽:原始输入-开运算结果
kernel = np. ones ((7,7) , np.uint8) blackhat =cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel) cv_show('First',blackhat)
黑帽子:闭运算-原始输入
图像梯度—Sobel
sobelx = cv2.Sobel(img, cv2.CV_64F,1,0,ksize=3) cv_show('First',sobelx)
ddepth:图像的深度
dx和dy分别表示水平和竖直方向
ksize是Sobel算子的大小