本文以下OpenCV都简写成"cv2"的形式,所有img都默认为一张图片
关联文章:
OpenCV和图像处理(二)
一、基本操作:
1、OpenCV读取和保存图像
img = cv2.imread('xx.jpg', flags='用什么模式读取图片[彩色or灰度]')
#读取图片并显示
cv2.imshow('show', img)
cv2.waitKey(0)
#保存图片
cv2.imwrite(path:str, img)
2、了解BGR和HSV颜色空间
RGB在cv2中顺序其实是BGR,但是其颜色过渡(指从红到绿到蓝)是离散的,为了便于连续操作,就可以使用HSV颜色空间。
色调H[0-179]:逆时针顺序 => 红-绿-蓝。
饱和度S[0-255]:饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。中心饱和度0,是白色;边缘饱和度达到最高。
明度V:[0-255]:V是竖着圆柱体的方向,表示颜色明亮的程度 。表面最明亮,越往下颜色越深,底下是黑色。
3、图像灰度和二值化
灰度是指没有通道,0-255是黑色的"深浅";二值化是指通过一个阈值将像素值分为两个值,比如0和255。虽然普通图像也能做二值化,但是一般都是灰度图再去做二值化。二值化有两种操作:
普通阈值二值化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转成灰度图像
ret, img2 = cv2.threshold(img_gray, thresh, maxval, type, dst=None)#转成二值化
r'''
解释一下cv2.threshold。img_gray是传入图像,thresh就是阈值,maxval是最大值,dst默认None。
返回第一个参数ret=thresh;第二个是二值化后的图片。
特别地:type可以有很多选项,之间可以+、&[and]、|[or]等操作:
------------------------------------------------------------------------
cv2.THRESH_BINARY if v > thresh : v = maxval else v = 0
cv2.THRESH_BINARY_INV THRESH_BINARY的反转
cv2.THRESH_TRUNC if v > thresh : v = maxval else v 不变
cv2.THRESH_TOZERO if v > thresh : v不变 else v = 0
cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转
------------------------------------------------------------------------
'''
一般来说,第一种操作了解type就可以了,因为更多时候用的是第二种操作:
自适应阈值二值化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转成灰度图像
adaptImg = cv2.adaptiveThreshold(img_gray, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)#用自适应阈值二值化
r'''
普通二值化是对全图操作,而自适应阈值类似"卷积核操作",这种方法效果更好,相当于各区域动态自适应调整自己的阈值,而不是整个图像用同一个阈值。参数img_gray是传入图像,maxValue是像素值上限,
adaptiveMethod:自适应方法
cv2.ADAPTIVE_THRESH_MEAN_C :领域内均值
cv2.ADAPTIVE_THRESH_GAUSSIAN_C :领域内像素点加权和,权重为一个高斯窗口
thresholdType:只有两个:cv2.THRESH_BINARY 和cv2.THRESH_BINARY_INV
blockSize: 规定正方形领域的大小,可以看做卷积核大小
C:常数C,阈值等于指定正方形领域的均值或加权和减去这个常数
'''
4、图像几何变换
4-1:仿射变换
仿射变换(Affine Transformation):简单说就是线性变换,基于仿射矩阵的变换。常见的操作如图像的缩放、平移、旋转、倾斜、镜像等。可以理解成空间的坐标系的变换导致了图像矩阵的变换。
常用的操作如下:何为仿射变换(Affine Transformation)
缩放图 = cv2.resize(img, (W’,H’), interpolation=cv2.INTER_CUBIC)
r'''
W'和H'是原图的W,H变换后值,interpolation有以下选项:
cv2.INTER_CUBIC # 立方插值[常用]
cv2.INTER_LINEAR # 双线形插值
cv2.INTER_NN # 最近邻插值
cv2.INTER_AREA # 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。
当图像放大时,类似于 CV_INTER_NN 方法
'''
翻转图 = cv2.transpose(img) #效果相当于给图像转置了
镜像图 = cv2.flip(img, flipCode=0)
r'''
关于flipCode,有三个区间:
0 垂直方向翻转
1 水平方向翻转
-1 水平、垂直方向同时翻转
'''
对于(4-1)来说,上面操作还很不够,更一般的情况是构造一个矩阵M,即式中3x3的矩阵,然后调用warpAffine方法进行具体变换:
h, w, c = src.shape
M1 = np.float32([[1, 0, 50], [0, 1, 50]])
M2 = np.float32([[0.5, 0, 0], [0, 0.5, 0]])
M3 = np.float32([[-1, 0, w], [0, 1, 0