OpenCV—python 颜色空间(RGB,HSV,Lab)与 颜色直方图
文章目录
- 一、图像分类的过程
- 二、开发环境:(安装)OpenCV 计算机视觉库
- 三、颜色空间(颜色模型:RGB,HSV,Lab)
- 3.1 opencv--HSV颜色空间
- 四、OpenCV处理图片
- 4.1 直接读取图片
- 4.2 读取图片并简单处理—图像特征:颜色直方图
- 颜色空间 RGB--HSV--Lab
- 灰度图与其颜色直方图
- 带蒙版的颜色直方图
- 多个颜色直方图
- 按多个通道计算颜色直方图
开发环境 jupyter notebook
一、图像分类的过程
图片必须经过标注
图片的类别为有限的集合,如{猫、狗、牛、马、狼}
每个类别的图片数量接近,如果不同类别图片的数量差异很大,训练出来的分类器容易倾向于图片数量多的类别划分训练/测试集
在训练之前,要把数据集划分为训练集(学习分类器)和测试集(对分类器进行评估)
训练集和测试集相互独立,不重合!特征表示 :对图片进行数值处理,转换成计算机可理解的特征,常用特征:
颜色直方图(Color Histograms
)
方向梯度直方图(Histogram of Oriented Gradients
,HOG)
局部二值模式(Local Binary Pattern
,LBP)分类算法 :一般分类算法即可:逻辑回归,支持向量机(SVM),随机森林
模型评估 : 混淆矩阵(
Confusion Matrix
)
精确度(Precision
)
召回率(Recall
)
F1值(F1 score
) recall与Precision的调和均值
二、开发环境:(安装)OpenCV 计算机视觉库
安装:
方法1:conda install -c menpo opencv
方法2:conda install --channel https://conda.anaconda.org/menpo opencv3
方法3:pip/conda install opencv-python
方法4:使用 whl 文件进行安装,进入网站 http://www.lfd.uci.edu/~gohlke/pythonlibs/。 下载与当前环境兼容的 opencv 文件。切换到该文件所在的目录,在命令行环境下使用 例如:安装文件:opencv_python-3.2.0-cp35-cp35m-win_amd64.whlpip install opencv_python-3.2.0-cp35-cp35m-win_amd64.whlopencv 的导入:
import cv2
cv2.__version__OpenCV的使用在线文档:http://docs.opencv.org/2.4.11/
三、颜色空间(颜色模型:RGB,HSV,Lab)
- RGB颜色空间有:
-
RGB :模型容易理解,连续变换颜色时不直观
(红red 绿green 蓝blue)三原色:取值范围都是:[0,255]
,[0,255]
,[0,255]
- HSV 是为了数字化图像提出来了,不能很好的表示人眼解释图像过程
-
H (Hue)色相:[0,360]
S (Saturation)饱和度,即色彩纯净度,0饱和度为白色
V (Value/Brightness):明度 0明度为纯黑色在OpenCV中,颜色范围:
H = [0,179]
S = [0,255]
V = [0,255] - Lab:颜色之间的欧式距离有具体含义–距离越大,人眼感官两种颜色差距越远
-
L 通道:像素亮度,上白下黑 中间灰
a 通道:左绿 右红
b 通道:一端纯蓝,一端纯黄 - 灰度图:每个像素[0,255]
-
根据人眼敏感度,把RGB图片转换为灰度图,不是简单把RGB每个通道取平均值
而是:Y = 0.299*R + 0.587*G + 0.114*B
3.1 opencv–HSV颜色空间
HSV(hue,saturation,value)颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集,圆锥的顶面对应于V=1. 它包含RGB模型中的R=1,G=1,B=1 三个面,所代表的颜色较亮。
色彩H由绕V轴的旋转角给定。红色对应于 角度0° ,绿色对应于角度120°,蓝色对应于角度240°。
在HSV颜色模型中,每一种颜色和它的补色相差180° 。 饱和度S取值从0到1,所以圆锥顶面的半径为1。
在圆锥的顶点(即原点)处,V=0,H和S无定义, 代表黑色。
圆锥的顶面中心处S=0,V=1,H无定义,代表白色。
从该点到原点代表亮度渐暗的灰色,即具有不同 灰度的灰色。
对于这些点,S=0,H的值无定义。可以说,HSV模型中的V轴对应于RGB颜色空间中的主对角线。 在圆锥顶面的圆周上的颜色,V=1,S=1,这种颜色是纯色。
HSV颜色空间它锥形的钻换模型中可以理解到: hue 通道的取值范围就应该是 0-360度,单数在opencv中其取值范围 [0,180]。
在opencv-hsv取值详情如下:
颜色库:
原本输出的 HSV 的取值范围分别是 0-360, 0-1, 0-1;但是为了匹配目标数据类型 OpenCV 将每个通道的取值范围都做了修改,于是就变成了 0-180, 0-255, 0-255,并且同时解释道:为了适应 8bit 0-255 的取值范围,将 hue 通道 0-360 的取值范围做了减半处理
四、OpenCV处理图片
4.1 直接读取图片
import cv2 #导入 Opencv
import os
import numpy as np
import matplotlib.pyplot as pltoutput_dir = 'output2' #设置输出文件夹,若不存在则创建
if not os.path.exists(output_dir):os.mkdir(output_dir) img_file = './../image.png' #读取图片
img = cv2.imread(img_file)type(img) #读入图片后得到ndarray 对象
img.shape #ndarray的三个维度分别是图片的:高,宽,通道# pyplot.imgshow 在显示图片时是按照RGB通道顺序显示,cv2则相反
# 需要通过 np.flip(img,axis = 2) 调整3个通道的顺序(若不调整图片颜色失真)
plt.imshow(np.flip(img,axis = 2))
plt.axis('off')
plt.show() #图1plt.imshow(img)
plt.axis('off') #不显示坐标
plt.show() #图2#输出并保存图片
output_image = os.path.join(output_dir,'image.png')
cv2.imwrite(output_image,img)
4.2 读取图片并简单处理—图像特征:颜色直方图
OpenCV-Python中调用的直方图计算函数为cv2.calcHist
。
"""
hist = cv2.calcHist([image], # 传入图像(列表)[0], # 使用的通道(使用通道:可选[0],[1],[2])None, # 没有使用mask(蒙版)[256], # HistSize[0.0,255.0]) # 直方图柱的范围# return->list
"""import cv2
import numpy as np
import matplotlib.pyplot as pltdef calcAndDrawHist(image, color): hist= cv2.calcHist([image], [0], None, [256], [0.0,255.0]) minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(hist) histImg = np.zeros([256,256,3], np.uint8) hpt = int(0.9* 256); for h in range(256): intensity = int(hist[h]*hpt/maxVal) cv2.line(histImg,(h,256), (h,256-intensity), color) return histImgif __name__ == '__main__': original_img = cv2.imread("666.png")img = cv2.resize(original_img,None,fx=0.6,fy=0.6,interpolation = cv2.INTER_CUBIC)b, g, r = cv2.split(img) histImgB = calcAndDrawHist(b, [255, 0, 0]) histImgG = calcAndDrawHist(g, [0, 255, 0]) histImgR = calcAndDrawHist(r, [0, 0, 255]) cv2.imshow("histImgB", histImgB) cv2.imshow("histImgG", histImgG) cv2.imshow("histImgR", histImgR) cv2.imshow("Img", img) cv2.waitKey(0) cv2.destroyAllWindows()
颜色空间 RGB–HSV–Lab
RGB颜色空间
import cv2
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline pic_file = '../data/images/image_crocus_0003.png'img_bgr = cv2.imread(pic_file, cv2.IMREAD_COLOR) #OpenCV读取颜色顺序:BRG
img_b = img_bgr[..., 0]
img_g = img_bgr[..., 1]
img_r = img_bgr[..., 2]
fig = plt.gcf() #图片详细信息fig = plt.gcf() #分通道显示图片
fig.set_size_inches(10, 15)plt.subplot(221)
plt.imshow(np.flip(img_bgr, axis=2)) #展平图像数组并显示
plt.axis('off')
plt.title('Image')plt.subplot(222)
plt.imshow(img_r, cmap='gray')
plt.axis('off')
plt.title('R')plt.subplot(223)
plt.imshow(img_g, cmap='gray')
plt.axis('off')
plt.title('G')plt.subplot(224)
plt.imshow(img_b, cmap='gray')
plt.axis('off')
plt.title('B')plt.show()
HSV颜色空间
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
img_h = img_hsv[..., 0]
img_s = img_hsv[..., 1]
img_v = img_hsv[..., 2]fig = plt.gcf() # 分通道显示图片
fig.set_size_inches(10, 15)plt.subplot(221)
plt.imshow(img_hsv)
plt.axis('off')
plt.title('HSV')plt.subplot(222)
plt.imshow(img_h, cmap='gray')
plt.axis('off')
plt.title('H')plt.subplot(223)
plt.imshow(img_s, cmap='gray')
plt.axis('off')
plt.title('S')plt.subplot(224)
plt.imshow(img_v, cmap='gray')
plt.axis('off')
plt.title('V')plt.show()
L*a*b*颜色空间
img_lab = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2LAB)
img_ls = img_lab[..., 0]
img_as = img_lab[..., 1]
img_bs = img_lab[..., 2] # 分通道显示图片
fig = plt.gcf()
fig.set_size_inches(10, 15)plt.subplot(221)
plt.imshow(img_lab)
plt.axis('off')
plt.title('L*a*b*')plt.subplot(222)
plt.imshow(img_ls, cmap='gray')
plt.axis('off')
plt.title('L*')plt.subplot(223)
plt.imshow(img_as, cmap='gray')
plt.axis('off')
plt.title('a*')plt.subplot(224)
plt.imshow(img_bs, cmap='gray')
plt.axis('off')
plt.title('b*')plt.show()
灰度图与其颜色直方图
img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)
fig = plt.gcf()
fig.set_size_inches(5, 7.5)plt.imshow(img_gray, cmap='gray')
plt.axis('off')
plt.title('Gray')
plt.show()
"""cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) → hist参数说明images: 图片列表channels: 需要计算直方图的通道。[0]表示计算通道0的直方图,[0,1,2]表示计算通道0,1,2所表示颜色的直方图mask: 蒙版,只计算值>0的位置上像素的颜色直方图,取None表示无蒙版histSize: 每个维度上直方图的大小,[8]表示把通道0的颜色取值等分为8份后计算直方图ranges: 每个维度的取值范围,[lower0, upper0, lower1, upper1, ...],lower可以取到,upper无法取到hist: 保存结果的ndarray对象accumulate: 是否累积,如果设置了这个值,hist不会被清零,直方图结果直接累积到hist中
""" img_gray_hist = cv2.calcHist([img_gray], [0], None, [256], [0, 256])plt.plot(img_gray_hist)
plt.title('Grayscale Histogram')
plt.xlabel('Bins')
plt.ylabel('# of Pixels')
plt.show()
带蒙版的颜色直方图
# 读取模板
mask_file = '../data/masks/mask_crocus_0003.png'
mask = cv2.imread(mask_file, cv2.IMREAD_UNCHANGED)
help(cv2.calcHist)
img_gray_hist_with_mask = cv2.calcHist([img_gray], [0], mask, [256], [0, 256])
"""图片按位与cv2.bitwise_and(src1, src2[, dst[, mask]]) → dst参数说明src1: 图片1src2: 图片2dst: 保存结果的ndarray对象mask: 蒙版
"""
img_masked = cv2.bitwise_and(img_gray, img_gray, mask=mask)plt.imshow(img_masked, cmap='gray')
plt.axis('off')
plt.title('Image with mask')
plt.show()plt.plot(img_gray_hist_with_mask)
plt.title('Grayscale Histogram')
plt.xlabel('Bins')
plt.ylabel('# of Pixels')plt.show()
多个颜色直方图
# 按R、G、B三个通道分别计算颜色直方图
b_hist = cv2.calcHist([img_bgr], [0], None, [256], [0, 256])
g_hist = cv2.calcHist([img_bgr], [1], None, [256], [0, 256])
r_hist = cv2.calcHist([img_bgr], [2], None, [256], [0, 256])# 显示3个通道的颜色直方图
plt.plot(b_hist, label='B', color='blue')
plt.plot(g_hist, label='G', color='green')
plt.plot(r_hist, label='R', color='red')
plt.legend(loc='best')
plt.xlim([0, 256])
plt.show()# 显示3个通道的颜色直方图
plt.plot(b_hist, label='B', color='blue')
plt.plot(g_hist, label='G', color='green')
plt.plot(r_hist, label='R', color='red')
plt.legend(loc='best')
plt.xlim([0, 256])
plt.show()
按多个通道计算颜色直方图
关于直方图均衡详情 请点击
# 把一个像素的多个通道合在一起看作一个值
hist = cv2.calcHist([img_bgr], [0, 1, 2], None, [8, 8, 8], [0, 256, 0, 256, 0, 256])hist.shape
# 含义:B取值在[0, 32), G取值在[0, 32), R取值在[0, 32)的像素个数
hist[0, 0, 0]
OpenCV—python 颜色空间(RGB,HSV,Lab)与 颜色直方图相关推荐
- 2021-01-07 Python Opencv转换颜色空间 RGB转为HSV
Python Opencv转换颜色空间 RGB转为HSV 举个例子,通过摄像头把视频中的蓝色区域凸显出来,剩余的颜色均为黑色 import numpy as npcap = cv2.VideoCapt ...
- Python实现RGB和Lab颜色空间互转
Python实现RGB和Lab颜色空间互转 https://github.com/rubund/debian-home-assistant/blob/1a3e8f7e4b9ddec60a4380e14 ...
- 颜色空间模型(HSV\LAB\RGB\CMYK)
通过Photoshop的拾色器,我们知道表征颜色的模型的不止一种,本文将系统并且详细讨论这四种模型(HSV.LAB.RGB和CMYK)之间的联系以及应用. 本文部分章节整合了多位优秀博主的博客(链接见 ...
- 色彩空间(RGB, HSV, LAB, YUV)
RGB颜色空间 RGB(red,green,blue)颜色空间最常用的用途就是显示器系统(计算机.电视机等都是采用RGB颜色空间来进行图像显示).一般来说,电脑,电视机等是利用三个电子枪分别发射R分量 ...
- Python实现RGB转Lab颜色空间,PS:和PhotoShop转换结果一样
由于工作要求,需要把rgb颜色转成Lab颜色空间.网上一搜一大把的代码,但是和PS一对比,基本上都不对. 下面这张图是OpenCV官方文档的计算方法. 用Python实现代码如下: from math ...
- opencv python 将RGB表示的图像转换为HSV(或Ycbcr)表示
参考文章:在python中使用opencv将RGB图像转换为HSV及YCrCb图像(附代码)
- 你真的了解眼里所见的色彩吗?(一文总结RGB/HSV/Lab)
1 认识色彩 我们DNA里的氮元素,牙齿里的钙元素,血液里的铁元素,吃掉的东西里的碳元素,都是曾经宇宙大爆炸时的万千星辰散落后组成的,所以我们每个人都是星辰.--卡尔萨根 在我们的印象里,星辰都是斑斓 ...
- (OpenCV+Python)--RGB转HSI
cv2.cvtColor函数封装了各种颜色空间之间的转换,唯独没有RGB与HSI之间的转换,网上查来查去也只有C++或MATLAB版本的,自己要用到python里,所以就写写python版本的. HS ...
- python中颜色空间直方图_OpenCV—python 颜色空间(RGB,HSV,Lab)与 颜色直方图
一.图像分类的过程 image.png 图片必须经过标注 图片的类别为有限的集合,如{猫.狗.牛.马.狼} 每个类别的图片数量接近,如果不同类别图片的数量差异很大,训练出来的分类器容易倾向于图片数量多 ...
最新文章
- 用“ul+li”及css制作韩国风格菜单
- _mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h':no such file or directory
- 【4747】java语言程序设计(一)2011年10月考试复习资料_全国2011年10月自考Java语言程序设计(一)试题3...
- HDU 4407 Sum(容斥原理+状态压缩)
- LeetCode 260. Single Number III
- UITableView 的横向滑动实现
- 小乌龟Git回滚重置及合并指定提交
- 早期关节炎患者延迟就诊风湿专科的长期影响
- 人机工程学产品设计案例_【设计案例】一组电子产品设计的合辑
- Excel的格式类型
- 永中表格中自定义函数提取网址
- 计算机课开机心得学生,计算机课学习心得范文体会范文(精选8篇)
- opencv用shi-Tomasi角点检测实现目标追踪
- 【渝粤教育】电大中专跨境电子商务理论与实务 (32)作业 题库
- 交换机之恢复重置设备密码
- 课改要实现“软着陆”
- matlab将图片旋转的代码_论文写作经验分享word+mathtype+matlab
- IntelliJ idea中集成多个git项目模块
- ‘大案牍术’告诉你为什么《长安十二时辰》这么火!
- (附源码)计算机毕业设计ssm高校线上教学系统
热门文章
- js 中添加php数组元素,JS数组添加元素方法总结
- 金属材料专业与计算机专业,金属材料工程
- 反编译apk文件查看源码,反编译apk获取资源
- 外设测试 - LCD 接口测试
- vim 退出命令(保存、放弃保存)
- ios测试续航软件,7款iPhone测试iOS14.5电池续航:这2款iPhone别升级了
- 攻防演练 | RASP让WebShell 破防了
- Android探索之旅(第十四篇)Android中实现炫酷效果的Demo(持续收录中......)
- 李飞飞高徒Andrej Karpathy为大家答疑解惑
- 微信上传图片。【代码示例】