随着人工智能的不断发展,OpenCV这门技术也越来越重要,很多人都开启了学习OpenCV,本文就介绍了OpenCV的基础内容。
在计算机中,按照颜色和灰度的多少可以将图像分为四种基本类型。
二值图像
:由0、1两个值构成,“0”代表黑色,“1”代白色。由于每一像素(矩阵中每一元素)取值仅有0、1两种可能,所以计算机中二值图像的数据类型通常为1个二进制位。二值图像通常用于文字、线条图的扫描识别(OCR)和掩膜图像的存储。灰度图像
:取值范围通常为[0,255]。因此其数据类型一般为8位无符号整数的(int8),这就是人们经常提到的256灰度图像。“0”表示纯黑色,“255”表示纯白色,中间的数字从小到大表示由黑到白的过渡色。索引图像
:索引图像的文件结构比较复杂,除了存放图像的二维矩阵外,还包括一个称之为颜色索引矩阵MAP的二维数组。真彩色RGB图像
:RGB图像与索引图像一样都可以用来表示彩色图像。与索引图像一样,它分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。但与索引图像不同的是,RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由R、G、B三个分量来表示,M、N分别表示图像的行列数,三个M x N的二维矩阵分别表示各个像素的R、G、B三个颜色分量。RGB图像的数据类型一般为8位无符号整形,通常用于表示和存放真彩色图像,当然也可以存放灰度图像。本片文章的目标:
- 能够理解色彩空间的概念
- 能够使用色彩空间的相互转换
- 能够编程实现提取特定颜色物体
- 能够熟练运用几何变换
- 能够掌握图像矫正的相关知识
一、将图像在BGR模式与RGB模式之间转换
import cv2
import numpy as np
img1=cv2.imread("kdx.jpg")
img1 = cv2.resize(img1,(480,640))
rgb = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)#图像类型转换函数
cv2.imshow("BGR",img1)
cv2.imshow("RGB",rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像对象rgb已经转换为rgb格式,接着我们将其转换回BGR格式
bgr = cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR)
cv2.imshow("BGR2",bgr)
cv2.waitKey(0)
cv2.destroyAllWindows()
二、将图像在BGR模式与GRAY模式之间转换
import cv2
import numpy as np
img1=cv2.imread("kdx.jpg")
img1 = cv2.resize(img1,(480,640))
gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
cv2.imshow("GRAY",gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出各类型图像的shape并实现通道分离
import cv2
import numpy as np
img1=cv2.imread("kdx.jpg")
img1 = cv2.resize(img1,(480,640))
rgb = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
bgr = bgr = cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR)
gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
print(f"BGR图像的shape为{bgr.shape}")
print(f"GRAY图像的shape为{gray.shape}")
BGR图像的shape为(640, 480, 3)
GRAY图像的shape为(640, 480)
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图像颜色通道分离
通过以上对比,可以得出结论:GRAY转换为BRG颜色空间,各通道值相同
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。、这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。
色调H:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
一、将图像在BGR模式与HSV模式之间转换
import cv2
import numpy as np
img1=cv2.imread("kdx.jpg")
img1 = cv2.resize(img1,(480,640))
hsv=cv2.cvtColor(img1,cv2.COLOR_BGR2HSV)#转换为HSV颜色空间
cv2.imshow("HSV",hsv)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像对象rgb已经转换为HSV格式,接下来,我们再将其转换回BGR格式
bgr3=cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)#转换为HSV颜色空间
cv2.imshow("BGR",bgr3)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
img2=cv2.imread("shape.png")
cv2.imshow("SRC",img2)
hsv = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)#图像类型转换函数
cv2.imshow("HSV",hsv)
lowerb_hsv = np.array([0,43,46])#要识别颜色的下限
upperb_hsv = np.array([10,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()
以此类推,我们将很好的学会了提取图像中其他颜色的区域,接下来,我们将以原图为例,提取其中的绿色部分
import cv2
import numpy as np
img=cv2.imread("shape.png")
cv2.imshow("SRC",img)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)#图像类型转换函数
cv2.imshow("HSV",hsv)
lowerb_hsv = np.array([37,43,46])#要识别颜色的下限
upperb_hsv = np.array([77,255,255])#要识别的颜色的上限,青色也是
mask = cv2.inRange(hsv, lowerb_hsv, upperb_hsv)
green = cv2.bitwise_and(img,img,mask=mask)
cv2.imshow("GREEN",green)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像简单的几何变换-图像缩放
import cv2
import numpy as np
img=cv2.imread("kdx.jpg")
rows,cols,_ = img.shape
#第一种缩放方式
size1 = (int(rows*0.7),int(cols*0.5))#宽变成0.9倍,长变成0.8倍
img_resize1 = cv2.resize(img,size1)
#第二种缩放方式
img_resize2 = cv2.resize(img,None,fx=1.5,fy=1.1)#宽变成1.5倍,长变成1.1倍
cv2.imshow("SRC",img)
cv2.imshow("RESIZE1",img_resize1)
cv2.imshow("RESIZE2",img_resize2)
cv2.waitKey(0)
cv2.destroyAllWindows()
在图像变换时,我们有不同的图像插值方式,不同的方式有不同的变化
#示例,图像缩小操作
size1 = (int(rows*0.9),int(cols*0.8))#宽变成0.9倍,长变成0.8倍
img_resize1 = cv2.resize(img,size1,cv2.INTER_AREA)
cv2.imshow("RESIZE3",img_resize1)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像翻转
语法:
dst = cv2.flip( src, flipCode )
flipCode参数:0,正数,负数
0绕着x轴翻转
img_flip1=cv2.flip(img,0)#x轴翻转
cv2.imshow("FLIP1",img_flip1)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像仿射变换
平移:cv2.warpAffine()
rows,cols,_ = img.shape
x = 100
y = 200
M = np.float32([[1,0,x],[0,1,y]])#转换矩阵
img_move=cv2.warpAffine(img,M,(cols,rows))#平移操作,注意(cols,rows)
cv2.imshow("MOVE",img_move)
cv2.waitKey(0)
cv2.destroyAllWindows()
旋转
语法:retval = cv2.getRotationMatrix2D(center,anle,scale)
center:旋转中心
height,width,_ = img.shape
M = cv2.getRotationMatrix2D((width/2, height/2), 45, 0.6)
img_rotate=cv2.warpAffine(img,M,(width, height))#平移操作
cv2.imshow("ROTATE",img_rotate)
cv2.waitKey(0)
cv2.destroyAllWindows()
透视
语法1:
转换矩阵 M = cv2.getPerspectiveTransform(pts_o, pts_d)
语法2:
dst = cv2.warpPerspective(img, 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()
到这里本篇文章就要结束了,本次主要介绍了图像的色彩空间转换与简单的几何变换。