opencv:图像空间转换与几何变换
1.颜色空间转换:从 BGR 到灰度图,或者BGR 到 HSV 等。
H(色彩/色度)的取值范围是 [0,179], S(饱和度)的取值范围 [0,255],V(亮度)的取值范围 [0,255]。
gary = cv.cvtColor(image, cv.COLOR_BGR2GRAY) # 灰度图
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)#hsv
2.利用色彩空间对物体进行追踪
在 HSV 颜色空间中要比在 BGR 空间中更容易表示一个特定颜色。在我们的程序中,我们要提取的是一个蓝色的物体。下面就是就是我们要做的几步:
• 从视频中获取每一帧图像
• 将图像转换到 HSV 空间
• 设置 HSV 阈值到蓝色范围。
• 获取蓝色物体,当然我们还可以做其他任何我们想做的事,比如:在蓝色
物体周围画一个圈。
import cv2 as cv
import numpy as np
def extrace_color():
capture = cv.VideoCapture(0)
while (True):
#获取每一帧的画面
ret, frame = capture.read()
if ret == False:
break;
#将画面转换到HSV
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
#设定要抓取的值的范围(蓝色)
lower_hsv = np.array([110, 50, 50])
heiger_hsv = np.array([130, 255, 255])
#根据阈值来构件掩盖
mask = cv.inRange(hsv, lowerb=lower_hsv, upperb=heiger_hsv)
#对原图与掩盖进行位运算 dst=cv.bitwise_and(frame,frame,mask=mask)
cv.imshow("mask", mask)
cv.imshow("dst",dst)
c = cv.waitKey(40)
if c == 27:
break
extrace_color()
cv.destroyAllWindows()
3.几何变换
扩展缩放改变图像的大小:cv…resize()
在缩放时我们推荐使用 cv2.INTER_AREA,
在扩展时我们推荐使用 v2.INTER_CUBIC(慢) 和 v2.INTER_LINEAR。
import cv2 as cv
import numpy as np
image=cv.imread('D:/code/opencv/images/1.png')
cv.imshow("退学",image)
res=cv2.resize(image,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)
#使用缩放因子
cv.imshow("1",res)
#OR
# 这里呢,我们直接设置输出图像的尺寸,所以不用设置缩放因子
height,width=image.shape[:2]
res1=cv2.resize(image,(2*width,2*height),interpolation=cv2.INTER_CUBIC)
cv.imshow("2",res1)
cv.waitKey(0)
cv.destroyAllWindows()
4.平移:
cv2.warpAffine(
image,
matrix[:2, :],
dsize = (image.shape[1], image.shape[0]),
flags = params.cvInterpolation(),
borderMode = params.cvBorderMode(),
borderValue = params.cval,
平移就是将对象换一个位置。如果你要沿(x,y)方向移动,移动的距离
是(tx,ty),你可以以下面的方式构建移动矩阵:
src: 输入图像
M: 变换矩阵,反映平移或旋转的关系,为inputArray类型的2x3的变换矩阵
dsize:输出图像的大小
flags:插值方法, 有
cv2.INTER_LINEAR,双线性插值(为默认设置)
cv2.INTER_NEAREST,最近邻插值
cv2.INTER_CUBIC, 样条插值,4x4像素邻域的双三次插值
cv2.INTER_AREA:区域插值,v使用像素区域关系进行重采样
cv2.INTER_LANCZOS4,lanczoc插值,8x8邻域的lanczoc插值
borderMode: 边界像素模式
borderbValue:重点,边界填充值,默认情况下,它为0
import cv2 as cv
import numpy as np
image=cv.imread('D:/code/opencv/images/1.png')
cv.imshow("退学",image)
rows,cols,c=image.shape
print(rows,cols,c)
M=np.array([1,0,10,0,1,10]).reshape(2,3)
print(M)
dst=cv.warpAffine(image,M,(rows,cols))
cv.imshow("1",dst)
cv.waitKey(0)
cv.destroyAllWindows()
!!!!我觉得就是这样写啊!为什么一直报错啊!!!!
5.旋转
同样也需要一个矩阵M
为了构建这个旋转矩阵,OpenCV 提供了一个函数:cv2.getRotationMatrix2D。
import cv2 as cv
import numpy as np
image=cv.imread('D:/code/opencv/images/1.png')
cv.imshow("退学",image)
rows,cols,c=image.shape
# 这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
# 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题
M=cv.getRotationMatrix2D((cols/2,rows/2),45,0.6) # 第三个参数是输出图像的尺寸中心
dst=cv.warpAffine(image,M,(2*cols,2*rows))
cv.imshow("1",dst)
cv.waitKey(0)
cv.destroyAllWindows()
5.仿射变换
原图中平行的依然平行
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('drawing.png')
rows,cols,ch=img.shape
pts1=np.float32([[50,50],[200,50],[50,200]])
pts2=np.float32([[10,100],[200,50],[100,250]])
M=cv2.getAffineTransform(pts1,pts2)
dst=cv2.warpAffine(img,M,(cols,rows))
plt.subplot(121,plt.imshow(img),plt.title('Input'))
plt.subplot(121,plt.imshow(img),plt.title('Output'))
plt.show()
6.透视变换:
这个变换矩阵可以有函数cv2.getPerspectiveTransform() 构建。然后把这个矩阵传给函数cv2.warpPerspective。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('sudokusmall.png')
rows,cols,ch=img.shape
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M=cv2.getPerspectiveTransform(pts1,pts2)
dst=cv2.warpPerspective(img,M,(300,300))
plt.subplot(121,plt.imshow(img),plt.title('Input'))
plt.subplot(121,plt.imshow(img),plt.title('Output'))
plt.show()