OpenCV
-
读取图片(numpy)
import cv2 print(cv2.getVersionString()) image = cv2.imread("opencv_logo.jpg") print(image.shape) # (h,w,c) cv2.imshow("image", image) cv2.waitKey() # 让窗口暂停
-
储存顺序:BGR
image = cv2.imread("opencv_logo.jpg") cv2.imshow("blue", image[:, :, 0]) cv2.imshow("green", image[:, :, 1]) cv2.imshow("red", image[:, :, 2]) # 将三通道做平方和加权平均 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) cv2.imshow("gray", gray) cv2.waitKey()
-
图片裁剪
image = cv2.imread("opencv_logo.jpg") crop = image[10:170, 40:200] cv2.imshow("crop", crop) cv2.waitKey()
-
画线
import cv2 import numpy as np image = np.zeros([300, 300, 3], dtype=np.uint8) # 黑色 # 画线cv2.line(input,起点坐标,终点坐标,线颜色((255,0,0)是蓝色),线粗细(两个像素)) cv2.line(image, (100, 200), (250, 250), (255, 0, 0), 2) # 画矩形cv2.rectangle(input,第一个顶点,对角顶点,颜色(绿色),粗细)) cv2.rectangle(image, (30, 100), (60, 150), (0, 255, 0), 2) # 画圆cv2.circle(input,圆心坐标,半径,颜色(红色),粗细) cv2.circle(image, (150, 100), 20, (0, 0, 255), 3) # 绘制字符串cv2.putText(input,str,坐标,字体(0为默认字体),缩放系数,颜色(白色),粗细,线条类型(1为实线)) cv2.putText(image, "hello", (100, 50), 0, 1, (255, 255, 255), 2, 1) cv2.imshow("image", image) cv2.waitKey()
-
滤波
-
滤波器的种类
3种线性滤波:方框滤波(没有normalize的均值滤波)、均值滤波、高斯滤波
2种非线性滤波:中值滤波、双边滤波
image = cv2.imread("plane.jpg") # 高斯滤波(input, gauss = cv2.GaussianBlur(image, (5, 5), 0) median = cv2.medianBlur(image, 5) cv2.imshow("image", image) cv2.imshow("gauss", gauss) cv2.imshow("median", median) cv2.waitKey()
-
均值平滑:滑动窗口所有系数为1/(窗口高*窗口宽),新生成的像素值就是窗口中心点以及周围所有像素值相加后的平均值。
dst=cv2.blur(src, ksize[, dst[, anchor[, borderType]]])
- 参数含义:
- src:源图像,通道数不限,数据类型必须为CV_8U, CV_16U, CV_16S, CV_32F or CV_64F;
- ksize:kernel尺寸、窗口大小,二元组类型,元素值可以是偶数或奇数;
- ksize越大,图像越模糊,清晰度越低。
- anchor:锚点,默认为(-1,-1),作用于滑动窗口的中心点;
- borderType:边界处理类型;
-
中值平滑:均值平滑一样也用到了滑动窗口,但是它并不是计算滑动窗口中的某种加权和,而是使用原图像滑动窗口中所有像素值排序后的中值作为新图像的像素值
dst=cv2.medianBlur(src, ksize[, dst])
- 参数含义:
- src:源图像,通道数可以是1,3或4,当ksize为3或者5时,数据类型可以是CV_8U, CV_16U, CV_32F,当使用更大的ksize时,数据类型只能是CV_8U;
- ksize:kernel尺寸、窗口大小,整数型,大于1的奇数值;
-
高斯滤波:滤波可分低通滤波和高通滤波两种。 而高斯滤波是指用高斯函数作为滤波函数的滤波操作 ,至于是不是模糊,要看是高斯低通还是高斯高通,低通就是模糊,高通就是锐化
cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])
src
: 输入图像,即要进行高斯模糊处理的图像。通常是一个 NumPy 数组。ksize
: 高斯内核大小。这是一个正的奇数,控制高斯核的大小。例如,值为(5, 5)
表示 5x5 大小的高斯核。值越大,平滑效果越强烈。sigmaX
: X 方向上的高斯标准差。如果设置为 0,则函数会自动从ksize
推导出合适的标准差。sigmaY
: Y 方向上的高斯标准差。如果未指定(默认值为 0),则与sigmaX
相同。dst
(可选): 输出图像,将高斯模糊后的图像存储在此处。如果没有提供,则函数会创建一个新的数组来存储结果。borderType
(可选): 可选的边界模式,用于处理边界像素。默认值为cv2.BORDER_DEFAULT
。
-
-
特征提取
image = cv2.imread("opencv_logo.jpg") gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 获取特征点,最多返回500个点,质量优于0.1,特征点之间的距离大于10像素 corners = cv2.goodFeaturesToTrack(gray, 500, 0.1, 10) for corner in corners: x, y = corner.ravel() cv2.circle(image, (int(x), int(y)), 3, (255, 0, 255), -1) cv2.imshow("corners", image) cv2.waitKey()
-
模版匹配
import cv2 import numpy as np image = cv2.imread("poker.jpg") gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) template = gray[75:105, 235:265] #一个菱形 区域模版,包含 # 标准相关匹配算法,将图片和模版都标准化之后再匹配,可以保证结果不受光照影响 match = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED) # 找出匹配系数大于0.9的匹配点 locations = np.where(match >= 0.9) w, h = template.shape[0:2] # zip(*locations[::-1])将匹配点的位置反转为 (x, y) 格式 for p in zip(*locations[::-1]): x1, y1 = p[0], p[1] x2, y2 = x1 + w, y1 + h cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.imshow("image", image) cv2.waitKey()
-
图像的梯度算法
gray = cv2.imread("opencv_logo.jpg", cv2.IMREAD_GRAYSCALE) laplacian = cv2.Laplacian(gray, cv2.CV_64F) # 二阶导 canny = cv2.Canny(gray, 100, 200) # 边缘检测 cv2.imshow("gray", gray) cv2.imshow("laplacian", laplacian) cv2.imshow("canny", canny) cv2.waitKey()
-
阈值算法(二值化算法):将图片分为黑白
gray = cv2.imread("bookpage.jpg", cv2.IMREAD_GRAYSCALE) # 阈值为10,最大灰度255 ret, binary = cv2.threshold(gray, 10, 255, cv2.THRESH_BINARY) # 自适应阈值算法:将图片划分为多个区域,每个区域独立计算阈值 binary_adaptive = cv2.adaptiveThreshold( gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 115, 1) # 自动计算阈值(聚类分析) ret1, binary_otsu = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) cv2.imshow("gray", gray) cv2.imshow("binary", binary) cv2.imshow("adaptive", binary_adaptive) cv2.imshow("otsu", binary_otsu) cv2.waitKey()
-
形态学算法(基于阈值图片)
import cv2 import numpy as np gray = cv2.imread("opencv_logo.jpg", cv2.IMREAD_GRAYSCALE) # 反向阈值 _, binary = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY_INV) kernel = np.ones((5, 5), np.uint8) erosion = cv2.erode(binary, kernel) # 腐蚀 dilation = cv2.dilate(binary, kernel) # 膨胀 cv2.imshow("binary", binary) cv2.imshow("erosion", erosion) cv2.imshow("dilation", dilation) cv2.waitKey()
-
调用电脑中的摄像头
- 获取摄像头序号:设备管理器
capture = cv2.VideoCapture(0) # 传入摄像头序号 # 循环读取每一帧的画面 while True: ret, frame = capture.read() # 读取画面 cv2.imshow("camera", frame) key = cv2.waitKey(1) # 等待键盘输入 if key != -1: # 如果键盘有输入 break capture.release()