#@Fu Xianjun.All Rights Reserved.
来了来了,今天的学习开始了!
我们的目标就是:
能够理解色彩空间的概念
能够使用色彩空间的相互转换
能够编程实现提取特定颜色物体
能够熟练运用几何变换
能够掌握图像矫正的相关知识
任务一 图像类型转换
案例一 将图像在BGR模式与RGB模式之间转换
import cv2
import numpy as npimg1=cv2.imread("pig.jpg")
rgb = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)#图像类型转换函数
cv2.imshow("BGR",img1)cv2.imshow("RGB",rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()
案例二 将图像在BGR模式与GRAY模式之间转换
gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
cv2.imshow("GRAY",gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
重点:颜色通道分离
print(f"BGR图像的shape为{bgr.shape}")
print(f"GRAY图像的shape为{gray.shape}")def Colorsplit(img):
(B,G,R) = cv2.split(img)#将BGR图像的颜色通道分离
cv2.imshow("blue",B)
cv2.imshow("green",G)
cv2.imshow("red",R)
cv2.waitKey(0)
cv2.destroyAllWindows()Colorsplit(bgr)#将转换前的RGB图像颜色通道分离
bgr2 = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
cv2.imshow("after",bgr2)
cv2.waitKey(0)
cv2.destroyAllWindows()Colorsplit(bgr2)#将转换后的RGB图像颜色通道分离
案例三 将图像在BGR模式与HSV模式之间转换
hsv=cv2.cvtColor(bgr,cv2.COLOR_BGR2HSV)#转换为HSV颜色空间
cv2.imshow("HSV",hsv)
cv2.waitKey(0)
cv2.destroyAllWindows()
任务二:提取指定颜色
案例一 提取图像中的红色区域
import cv2
import numpy as npimg2=cv2.imread("pig.jpg")
cv2.imshow("SRC",img2)
hsv = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)#图像类型转换函数
cv2.imshow("HSV",hsv)lowerb_hsv = np.array([156,43,46])#要识别颜色的下限
upperb_hsv = np.array([180,255,255])#要识别的颜色的上限mask = cv2.inRange(hsv, lowerb_hsv, upperb_hsv)
cv2.imshow("MASK",mask)
cv2.waitKey(0)
cv2.destroyAllWindows()red = cv2.bitwise_and(img2,img2,mask=mask)
cv2.imshow("RED",red)
cv2.waitKey(0)
cv2.destroyAllWindows()
突如其来的案例:图像怀旧特效
#coding:utf-8
import cv2 as cv
import numpy as np#读取原始图像
img = cv.imread('pig.jpg')#获取图像行和列
rows, cols = img.shape[:2]#新建目标图像
dst = np.zeros((rows, cols, 3), dtype="uint8")#图像怀旧特效
for i in range(rows):
for j in range(cols):
B = 0.272*img[i,j][2] + 0.534*img[i,j][1] + 0.131*img[i,j][0]
G = 0.349*img[i,j][2] + 0.686*img[i,j][1] + 0.168*img[i,j][0]
R = 0.393*img[i,j][2] + 0.769*img[i,j][1] + 0.189*img[i,j][0]
if B>255:
B = 255
if G>255:
G = 255
if R>255:
R = 255
dst[i,j] = np.uint8((B, G, R))
#显示图像
cv.imshow('result',np.vstack((img,dst)))
cv.waitKey()
cv.destroyAllWindows()
任务三 简单的几何变换
案例一 图像缩放
import cv2
import numpy as npimg=cv2.imread("pig.jpg")
rows,cols,_ = img.shape#第一种缩放方式
size1 = (int(rows*0.9),int(cols*0.8))#宽变成0.9倍,长变成0.8倍
img_resize1 = cv2.resize(img,size1)#第二种缩放方式
img_resize2 = cv2.resize(img,None,fx=2,fy=1.5)#宽变成两倍,长变成1.5倍
cv2.imshow("SRC",img)
cv2.imshow("RESIZE1",img_resize1)
cv2.imshow("RESIZE2",img_resize2)
cv2.waitKey(0)
cv2.destroyAllWindows()
案例二 图像翻转
img_flip1=cv2.flip(img,0)#x轴翻转
cv2.imshow("FLIP1",img_flip1)
cv2.waitKey(0)
cv2.destroyAllWindows()
旋转
语法:
retval = cv2.getRotationMatrix2D(center,anle,scale)
center:旋转中心
angle:旋转角度,正数为逆时针旋转,负数为顺时针旋转
scale:缩放大小
案例四 透视
语法1:
转换矩阵 M = cv2.getPerspectiveTransform(pts_o, pts_d)
pts_o为原始4个点坐标
pts_d为变换后4个点坐标
语法2:
dst = cv2.warpPerspective(img, M, dsize)
img为原图
dst为变换后的图
M为转换矩阵
dsize为变换后图像的大小
#读图
img = cv2.imread('shudu.jpg')
rows, cols,_ = img.shape# 原始点阵
pts_o = np.float32([[88, 177], [716, 85], [216, 695], [957, 551]]) # 这四个点为原始图片上数独的位置
pts_d = np.float32([[0, 0], [600, 0], [0, 600], [600, 600]]) # 这是变换之后的图上四个点的位置# 获取转换矩阵
M = cv2.getPerspectiveTransform(pts_o, pts_d)
# 应用变换
dst = cv2.warpPerspective(img, M, (600, 600)) # 最后一参数是输出dst的尺寸。可以和原来图片尺寸不一致。按需求来确定cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们下次见!