目录
图像基本运算
1.加减法
以加法举例子,加法在图像中有两种形式,一是将两张图片直接相加,而另一种是用OpenCV的add函数相加。两者的区别在于处理颜色的数值溢出的方法。假设有两个像素的颜色值a和b, 运用numpy直接相加的如下流程图所示。
运用add相加的结果如下流程图。
可以看出add 方法和直接相加的方法区别在于当相加的结果溢出时处理的手段不同,cv.add是在溢出时都取上限255,numpy则再相加后对255取余数。
注意!相加相减的图像他们的分辨率、通道数必须相等!(其实也就是矩阵的形状要一致)
另OpenCV中的相减为cv.subtract和矩阵相减与加法相比的运算法则类似,但是是在相减小于0时,subtract为取运算结果为0,矩阵减法为取256减去该负值。
2.图像混合
以addWeighted()实现,其功能为将两张分辨率和通道数都相等的图片按照权值相融合。
参数->
src1:输入图像1(数组) alpha:图像1的权值
src2:输入图像2(数组) beta:图像2的权值
gamma:图像1、2相加后添加的数值(整体加gamma)
计算公式为
import cv2
import numpy as np
im1 = cv2.imread('rainbow.png', flags=cv2.IMREAD_COLOR)#原图1
im2 = cv2.imread('zero.png', flags=cv2.IMREAD_COLOR)#原图2
im_addweight = cv2.addWeighted(im1, 0.5, im2, 0.5, 0)
#显示
cv2.imshow('im1', im1)
cv2.imshow('im2', im2)
cv2.imshow('im_addweight', im_addweight)
k =cv2.waitKey(0)
if k == ord('s'):
cv2.destroyAllWindows()
注:其中两个图像的权系数可以相加起来小于1
3.按位操作(与、或、非、异或)
与:bitwise_and()
或:bitwise_or()
非:bitwise_not()
异或:bitwise_xor()
逻辑运算这个比较简单,不解释了看图吧
import cv2
import numpy as np
im1 = cv2.imread('zero.png', flags=cv2.IMREAD_COLOR) #原图 圆形
im2 = cv2.imread('rec.png', flags=cv2.IMREAD_COLOR) #原图 菱形+五角星
im3 = cv2.bitwise_and(im1, im2) #AND操作
im4 = cv2.bitwise_or(im1, im2) #OR操作
im5 = cv2.bitwise_not(im1) #NOT操作
im6 = cv2.bitwise_xor(im1, im2) #XOR操作
#显示
cv2.imshow('ORI1',im1)
cv2.imshow('ORI2', im2)
cv2.imshow('AND', im3)
cv2.imshow('OR', im4)
cv2.imshow('NOT', im5)
cv2.imshow('XOR', im6)
k = cv2.waitKey(0)
if k == ord('s'):
cv2.destroyAllWindows()
图像处理方法
图像的颜色空间
不同的颜色空间即表现图像的参数不同,颜色空间的诞生是为了满足历史发展以来不同的需求,不同的颜色空间的表现特性不一样,在实际应用过程中需要根据自身的需要,通过转换颜色空间来选择合适的颜色空间。
具体对于颜色空间的概念可以参考颜色空间总结_ZhangPY的专栏-CSDN博客,这篇博客中给到了详细的介绍。
最常见的颜色空间有RGB、CMYK、HSV、HSI,其中RGB是一种增色模型,是当前应用最广泛的一种颜色空间,R表示红色、G表示绿色、B表示蓝色,RGB的颜色空间可由一个边长为255的立方体表示。CMYK是一种减色模型,颜色混在一起亮度会降低,常用于印刷行业,四个字母分别为C青(cyan)、M品红(Magenta),Y黄(Yellow)和K黑色(Black)。由于这些在人眼中不太容易分辨出颜色的区别,因此在图像处理中并不常用,多用的是后者HSI与HSV等。HSI、HSL和HSV还有HSB可以说是一回事,颜色模型也非常相近,对比于RGB来说图像处理更加受欢迎,H为色相(Hue)、S为饱和度/色度/彩度(Saturation)以及最后的差异,I为光强(Intensity)、L为亮度(Lightness)、V为明度(Value)以及B也是明度(Brightness)。
对于颜色空间的转换,通过cv2.cvtColor()实现
参数->
src为输入的图像
code便是想要转换的颜色空间,有如下表示:
import cv2
import numpy as np
im1 = cv2.imread('fruit_test.jpg', flags=cv2.IMREAD_COLOR)#原图
im1_gray = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY)#gray形式
im1_hsv = cv2.cvtColor(im1, cv2.COLOR_BGR2HSV)#HSV形式
im1_yuv = cv2.cvtColor(im1, cv2.COLOR_BGR2YUV)#YUV形式
#显示
cv2.imshow('im1', im1)
cv2.imshow('im1_gray', im1_gray)
cv2.imshow('im1_hsv', im1_hsv)
cv2.imshow('im1_yuv', im1_yuv)
k =cv2.waitKey(0)
if k == ord('s'):
cv2.destroyAllWindows()
几何变换
1.缩放
cv.resize()
实现缩放的功能
参数->
src 为操作的图像
dsize 该参数为一个元组(宽x高),表示改变后的图像大小
fx、fy为两个方向上的扩大倍数
注:(a)dsize和fx=,fy=只能用一个,使用dsize时无需填写fx与fy的数值,在使用fx与fy是dsize需要赋值None.(b)使用dsize时不可以用浮点数,而fx、fy可使用
interpolation 为插值法,常用的有cv2.INTER CUBIC、cv2.LINEAR和cv2.INTER AREA
import cv2
import numpy as np
im1 = cv2.imread('car_test2.jpg', flags=cv2.IMREAD_COLOR)#原图
im2 = cv2.resize(im1, None, fx=1.2, fy=2, interpolation=cv2.INTER_AREA)#X扩大2倍 y扩大2倍
height, width = im1.shape[:2]
im3 = cv2.resize(im1, (width*1, height*2), interpolation=cv2.INTER_AREA)#x扩大1.2倍 y扩大2倍
#显示
cv2.imshow('im1', im1)
cv2.imshow('im2', im2)
cv2.imshow('im3', im3)
k =cv2.waitKey(0)
if k == ord('s'):
cv2.destroyAllWindows()
2.平移和旋转
首先介绍一下原理:图像平移的原理便是将图像中所有的点按照平移量进行移动(水平或垂直),从原始的坐标(x0, y0)移动了(Δx,Δy)到了新坐标点(x1,y1)即完成一次变换。
以矩阵表示如下所示:
图像旋转的原理是将图像所有的点绕着某一个点旋转一个角度θ ,从原始的(x0, y0)(逆时针)旋转了θ ,得到新的坐标点(x1,y1)即完成一次旋转变换。
可表示为
通常的做法为绕着图像中心旋转,此时的旋转矩阵为
在OpenCV中需要构建的并非如原理所示的矩阵。
在平移中采用的方法为首先构造一个numpy的变换矩阵 ,将其存为np.float32的numpy数组,作为warpAffine的参数M。
在旋转中采用的是OpenCV中所提供的函数cv2.getRotationMatrix2D来构造旋转矩阵,最后通过warpAffine生成,具体如下代码所示。
import cv2
import numpy as np
im1 = cv2.imread('test1212.png', flags=cv2.IMREAD_COLOR)#原图
height, width, mode = im1.shape
dsize = (height, width) #获取生成图片的宽高
#平移
M = np.float32([[1,0,50],[0,1,150]]) #构造平移矩阵
im2 = cv2.warpAffine(im1, M, dsize) #生成平移结果
#旋转
center = ((height - 1)/2.0, (width - 1)/2.0) #获取旋转中心
R = cv2.getRotationMatrix2D(center, 90, 1) #构造旋转矩阵
im3 = cv2.warpAffine(im1, R, dsize) #生成旋转结果
#显示
cv2.imshow('im1', im1)
cv2.imshow('im2', im2)
cv2.imshow('im3', im3)
k =cv2.waitKey(0)
if k == ord('s'):
cv2.destroyAllWindows()
最后分享一个封面啦哈哈哈哈我爱小姐姐