Python-OpenCV入门(4)-色彩空间与几何变换

01

随着人工智能的不断发展,OpenCV这门技术也越来越重要,很多人都开启了学习OpenCV,本文就介绍了OpenCV的基础内容。

在计算机中,按照颜色和灰度的多少可以将图像分为四种基本类型。

  1. 二值图像:由0、1两个值构成,“0”代表黑色,“1”代白色。由于每一像素(矩阵中每一元素)取值仅有0、1两种可能,所以计算机中二值图像的数据类型通常为1个二进制位。二值图像通常用于文字、线条图的扫描识别(OCR)和掩膜图像的存储。
  2. 灰度图像:取值范围通常为[0,255]。因此其数据类型一般为8位无符号整数的(int8),这就是人们经常提到的256灰度图像。“0”表示纯黑色,“255”表示纯白色,中间的数字从小到大表示由黑到白的过渡色。
  3. 索引图像:索引图像的文件结构比较复杂,除了存放图像的二维矩阵外,还包括一个称之为颜色索引矩阵MAP的二维数组。
  4. 真彩色RGB图像:RGB图像与索引图像一样都可以用来表示彩色图像。与索引图像一样,它分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。但与索引图像不同的是,RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由R、G、B三个分量来表示,M、N分别表示图像的行列数,三个M x N的二维矩阵分别表示各个像素的R、G、B三个颜色分量。RGB图像的数据类型一般为8位无符号整形,通常用于表示和存放真彩色图像,当然也可以存放灰度图像。

本片文章的目标:

  1. 能够理解色彩空间的概念
  2. 能够使用色彩空间的相互转换
  3. 能够编程实现提取特定颜色物体
  4. 能够熟练运用几何变换
  5. 能够掌握图像矫正的相关知识

line
Python-OpenCV入门(4)-色彩空间与几何变换_第1张图片

01
图像类型转换

一、将图像在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()

Python-OpenCV入门(4)-色彩空间与几何变换_第2张图片
Python-OpenCV入门(4)-色彩空间与几何变换_第3张图片

图像对象rgb已经转换为rgb格式,接着我们将其转换回BGR格式

bgr = cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR)
cv2.imshow("BGR2",bgr)
cv2.waitKey(0)
cv2.destroyAllWindows()

Python-OpenCV入门(4)-色彩空间与几何变换_第4张图片

二、将图像在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()

Python-OpenCV入门(4)-色彩空间与几何变换_第5张图片

02
颜色通道分离

输出各类型图像的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图像颜色通道分离

Python-OpenCV入门(4)-色彩空间与几何变换_第6张图片Python-OpenCV入门(4)-色彩空间与几何变换_第7张图片Python-OpenCV入门(4)-色彩空间与几何变换_第8张图片

将灰度图进行类型转换并进行通道分析,与以上做对比

bgr2 = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
cv2.imshow("after",bgr2)
cv2.waitKey(0)
cv2.destroyAllWindows()
Colorsplit(bgr2)#将转换后的RGB图像颜色通道分离

Python-OpenCV入门(4)-色彩空间与几何变换_第9张图片

通过以上对比,可以得出结论:GRAY转换为BRG颜色空间,各通道值相同

03
HSV模式

HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。、这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。

色调H:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;


饱和度S:取值范围为0.0~1.0;

亮度V:取值范围为0.0(黑色)~1.0(白色)。
Python-OpenCV入门(4)-色彩空间与几何变换_第10张图片

一、将图像在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()

Python-OpenCV入门(4)-色彩空间与几何变换_第11张图片
图像对象rgb已经转换为HSV格式,接下来,我们再将其转换回BGR格式

bgr3=cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)#转换为HSV颜色空间
cv2.imshow("BGR",bgr3)
cv2.waitKey(0)
cv2.destroyAllWindows()

Python-OpenCV入门(4)-色彩空间与几何变换_第12张图片

应用所学知识提取图像中的红色区域
Python-OpenCV入门(4)-色彩空间与几何变换_第13张图片

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()

Python-OpenCV入门(4)-色彩空间与几何变换_第14张图片
Python-OpenCV入门(4)-色彩空间与几何变换_第15张图片

red = cv2.bitwise_and(img2,img2,mask=mask)
cv2.imshow("RED",red)
cv2.waitKey(0)
cv2.destroyAllWindows()

Python-OpenCV入门(4)-色彩空间与几何变换_第16张图片

以此类推,我们将很好的学会了提取图像中其他颜色的区域,接下来,我们将以原图为例,提取其中的绿色部分

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()

Python-OpenCV入门(4)-色彩空间与几何变换_第17张图片Python-OpenCV入门(4)-色彩空间与几何变换_第18张图片

04
几何变换

图像简单的几何变换-图像缩放

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()

Python-OpenCV入门(4)-色彩空间与几何变换_第19张图片
Python-OpenCV入门(4)-色彩空间与几何变换_第20张图片

在图像变换时,我们有不同的图像插值方式,不同的方式有不同的变化

Python-OpenCV入门(4)-色彩空间与几何变换_第21张图片

#示例,图像缩小操作
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()

Python-OpenCV入门(4)-色彩空间与几何变换_第22张图片

图像翻转

语法:
dst = cv2.flip( src, flipCode )

flipCode参数:0,正数,负数
0绕着x轴翻转


正数绕着x轴翻转

负数绕着x轴,y轴同时翻转

img_flip1=cv2.flip(img,0)#x轴翻转
cv2.imshow("FLIP1",img_flip1)
cv2.waitKey(0)
cv2.destroyAllWindows()

Python-OpenCV入门(4)-色彩空间与几何变换_第23张图片

图像仿射变换

平移: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()

Python-OpenCV入门(4)-色彩空间与几何变换_第24张图片

旋转

语法:retval = cv2.getRotationMatrix2D(center,anle,scale)

center:旋转中心


angle:旋转角度,正数为逆时针旋转,负数为顺时针旋转

scale:缩放大小

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()

Python-OpenCV入门(4)-色彩空间与几何变换_第25张图片

透视
语法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()

Python-OpenCV入门(4)-色彩空间与几何变换_第26张图片Python-OpenCV入门(4)-色彩空间与几何变换_第27张图片

06
总结

到这里本篇文章就要结束了,本次主要介绍了图像的色彩空间转换与简单的几何变换。


如果我们想要得出更好的结果,我们就需要关注处理函数的变换方式以及插值方式。

美丽的图片都是经过大量的色彩变换组合而来,我们本篇讲的都是图像变换处理的基础,将在后续文章中更详细的学习我们的计算机视觉。

line
end

点个关注不迷路
觉得孔哥写的对你有帮助?请分享给更多的人
欢迎一起学习!博客平台同步发布,请搜索——和孔哥一起学

dianzan

版权声明:
作者: 和孔哥一起学
导师:Fu Xianjun
本文版权归作者导师共有,欢迎转载,但未经作者同意必须在文章页面注明来源及原作者或原文链接,否则保留追究法律责任的权利。

你可能感兴趣的:(python,opencv,笔记,python,opencv)