首页 > 编程知识 正文

opencv 仿射变换,opencv图像特征提取与识别

时间:2023-05-04 22:55:33 阅读:34246 作者:2549

原文链接: http://www.juzi code.com/archives/5508

返回到Opencv-Python教程

在数字图像中,最常见的颜色模型是RGB模型(在红、绿、蓝、OpenCV中彩色图像的组织顺序是B-G-R,仍然是RGB模型),该模型是硬件处理的常见模型,例如

1、颜色转换cvtColor () OpenCV为各种颜色模型()颜色空间) (如从BGR转换为HSV、从HSV转换为BGR或从BGR转换为灰度)提供了相互转换的界面。

色彩空间转换函数cvtColor ()的接口格式:

dst=cv2.cvtcolor(src,code[,dst[,dstCn]] ) src是源图像对象; 代码是OpenCV中颜色空间定义的宏常量,可以使用colors=[IforIindir(cv ) ifI.startswith(color_ ) ]的方法遍历所有颜色空间转换的名称,版本4 比较常用的有COLOR_BGR2GRAY、COLOR_GRAY2BGR、COLOR_BGR2HSV、COLOR_BGR2RGB,这些名称都可以看出有名的含义。 dstCn是目标图像的通道数,如果设置为0,则根据源图像自动计算目标图像的通道数。

在以下示例中,导入图像后的图像默认为BGR颜色空间,分别转换为GRAY颜色空间和HSV颜色空间:

importcv2print(VX公众号:桔子code/juzicode.com) (print ) ) cv2._version__: ),cv2.__version__ Lena.jpg ' (img2=cv2.im read (.opencv-logo.png ' ) img_reT1=cv2.cvtcolor ) img1,cv2.color _ bgg img 199] ) print ) img _ re t1 [ 161,199 ] 3360 ' img _ re t1 ) img_reT2=cv2.cvtcolor(img2,cv2.COLOR_BGR2HSV ) 200]: ),img_ re T2 [ 100,200 ] ) cv2.imshow ) logo-cvtcolor ',img _ )。

VX公众号:桔子code/juzi code.com c v2._ _ version _ _ :4.5.2 img _ re t1.shape : (512,512 ) img1) 161,

从lena图像的执行结果来看,转换为GRAY的图像为黑白2色,也就是灰度图像,从图像的shape属性来看,图像也是单通道。 opencv-log图像转换为HSV后显示时,“颜色”看起来好像发生了变化。 这是由于HSV变量在imshow中显示的效果,并不意味着颜色发生了变化。 这也可以通过将HSV颜色重新转换为BGR颜色来验证。

2、HSV色彩空间

HSV色彩空间通常以倒锥形表示。

在该倒锥形中,小括号内的数值以OpenCV CV_8U类型的数据为例。 自下而上的红色直线表示亮度v,越往上亮度越大,OpenCV中可能的值范围为0~255; 从圆心伸出的半径为饱和度v,表示颜色的纯度,距离圆心越远,值越大,取值范围为0~255的水平截面上的圆的角度表示色度h。 CV_8U类型的数值显示范围小于360,因此OpenCV的可能值范围实际为0到180 (用圆的角度除以2 )。 这里,红色色度为0、绿色色度为120、OpenCV下的数值为60、蓝色色度为240、OpenCV下的色度为

BGR转换为HSV的方法为:

v=max(r,g,b ) ) )。

s=(max(r,g,b ) -最小(r ) r,g,b ) ) 255/max,g,b ) ) ) ) ) )。

max(r,g,b )=0,S=0时

如果r=max(r,g,b ),h=(g-b )r-min ) r,g,b ) ) 30

g=max(r、g、b )、h=60(B-r )g-min ) r、g、b ) * 30时

如果b=max(r,g,b ),h=120 ) r-g )b-min ) r,g,b ) * 30

如果

R=G=B,H=0; 如果H<0,H=H+360

下面我们以opencv-logo.png为例解释下HSV色彩空间和BGR色彩空间的对应关系:

import cv2print('VX公众号: 桔子code / juzicode.com')print('cv2.__version__:',cv2.__version__)def show_img(win_name,img,wait_time=0,img_ratio=0.5,is_show=True): if is_show is not True: return rows = img.shape[0] cols = img.shape[1] cv2.namedWindow(win_name, cv2.WINDOW_NORMAL )#cv2.WINDOW_AUTOSIZE) cv2.resizeWindow(win_name,(int(cols*img_ratio),int(rows*img_ratio))) cv2.imshow(win_name,img) #cv2.waitKey(wait_time) img = cv2.imread('..\opencv-logo.png') img_ret = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)show_img('logo',img)h,s,v = cv2.split(img_ret)show_img('h',h)show_img('s',s)show_img('v',v)minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(h) print('h[20,20]:',h[20,20]) #原图白色print('h[600,20]:',h[600,20])#原图黑色print('h[50,300]:',h[50,300])#原图红色print('h[400,50]:',h[400,50])#原图绿色print('h[500,500]:',h[500,500])#原图蓝色print('h: minVal, maxVal=',minVal, maxVal)minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(s) print('s[20,20]:',s[20,20])print('s[600,20]:',s[600,20])print('s[50,300]:',s[50,300])print('s[400,50]:',s[400,50])print('s[500,500]:',s[500,500])print('s: minVal, maxVal=',minVal, maxVal)minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(v) print('v[20,20]:',v[20,20])print('v[600,20]:',v[600,20])print('v[50,300]:',v[50,300])print('v[400,50]:',v[400,50])print('v[500,500]:',v[500,500])print('v: minVal, maxVal=',minVal, maxVal)cv2.waitKey(0)

运行结果:

cv2.__version__: 4.5.2h[20,20]: 0h[600,20]: 0h[50,300]: 0h[400,50]: 60h[500,500]: 120h: minVal, maxVal= 0.0 120.0s[20,20]: 0s[600,20]: 0s[50,300]: 255s[400,50]: 255s[500,500]: 255s: minVal, maxVal= 0.0 255.0v[20,20]: 255v[600,20]: 0v[50,300]: 255v[400,50]: 255v[500,500]: 255v: minVal, maxVal= 0.0 255.0

这个例子中用到了minMaxLoc()方法,可以计算出图像中的最小和最大值,这幅图像中色度H最大的是120对应的是蓝色。通过对比h分量和原图,原图的红色区域几乎是黑色,正好对应红色的色度值为0,原图的绿色区域稍暗,蓝色区域最亮,对应了绿色的色度值为60,蓝色的色度值为120,我们也可以在原图的红绿蓝3个区域中分别找3个像素点打印出H的值:

h[50,300]: 0 #红色像素h[400,50]: 60 #绿色h[500,500]: 120 #蓝色

对比s分量和原图,原图中红绿蓝三个区域对应的s分量都为最亮的白色,而其他区域都为最暗的黑色,因为红绿蓝3个区域对应的颜色非常“纯”,纯粹到只有三原色中的其中一种颜色,而白色区域BGR三色都为255,每种颜色都有,所以是最“不纯”的,这样其S值就为0,而文字部分的黑色区域其S值也为0。

对比v分量和原图,R、G、B三色中谁的值最大,表示的就是V的值,白色区域和红绿蓝区域都有一个分量的值为255,所以V的值就为255,而文字部分的黑色区域其V值也为0。

原文链接:http://www.juzicode.com/archives/5508

扩展阅读: Opencv-Python教程

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。