RGB转换HSL,HSV及切割车牌
目录
- HSL和HSV
- 简介
- 对比
- RGB与HSL HSV相互转换
- RGB->HSL HSV
- HSL->RGB
- HSV->RGB
- 一、图片颜色转换
- 1.转换为灰度图
- 2.转化为HSV HSL
- 二、车牌切割
- 1.读取
- 2.灰度化和二值化
- 3.闭运算
- 4.腐蚀(去掉螺丝孔带来的影响)
- 5.切割保存
- 链接
HSL和HSV
简介
HSL和HSV都是一种将RGB色彩模型中的点在圆柱坐标系中的表示法。这两种表示法试图做到比基于笛卡尔坐标系的几何结构RGB更加直观。HSL(HSI)即色相、饱和度、亮度(英语:Hue, Saturation, Lightness(Intensity))。HSV(HSB)即色相、饱和度、明度(英语:Hue, Saturation, Value(Brightness))。
**色相(H)**是色彩的基本属性,就是平常所说的颜色名称,如红色、黄色等。
**饱和度(S)**是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。
明度(V),亮度(L),取0-100%。HSL和HSV二者都把颜色描述在圆柱坐标系内的点,这个圆柱的中心轴取值为自底部的黑色到顶部的白色而在它们中间的是灰色,绕这个轴的角度对应于“色相”,到这个轴的距离对应于“饱和度”,而沿着这个轴的高度对应于“亮度”、“色调”或“明度”。
对比
为了更为直观的对比我们可以直接观察3D模型的变化
3D模型
HSL在L轴向上延申的同时亮度越来越高,颜色更趋近于纯净的白色。
HSV在V轴向上延申的同时明度越来越高,颜色更为明亮、饱和。
RGB与HSL HSV相互转换
RGB->HSL HSV
设 (r, g, b)分别是一个颜色的红、绿和蓝坐标,它们的值是在0到1之间的实数。设max等价于r, g和b中的最大值。设min等于这些值中的最小者。要找到在HSL空间中的 (h, s, l)值,这里的h ∈ [0, 360)度是角度的色相角,而s, l ∈ [0,1]是饱和度和亮度,计算为:
HSL->RGB
给定HSL空间中的 (h, s, l)值定义的一个颜色,带有h在指示色相角度的值域[0, 360]中,分别表示饱和度和亮度的s和l在值域[0, 1]中,相应在RGB空间中的 (r, g, b)三原色,带有分别对应于红色、绿色和蓝色的r, g和b也在值域[0, 1]中,它们可计算为:
首先,如果s = 0,则结果的颜色是非彩色的、或灰色的。在这个特殊情况,r, g和b都等于l。注意h的值在这种情况下是未定义的。
当s ≠ 0的时候,可以使用下列过程:
HSV->RGB
类似的,给定在HSV中 (h, s, v)值定义的一个颜色,带有如上的变化于0到360之间的h,和分别表示饱和度和明度的变化于0到1之间的s和v,在RGB空间中对应的 (r, g, b)三原色可以计算为(R,G,B变化于0到1之间):
一、图片颜色转换
1.转换为灰度图
#使用opencv
import cv2
import numpy as np
source_path="D:\myworkspace\bmp\hutao.png"
#取灰度图片
cv_read=cv2.imread(source_path,0)
cv2.imshow('huidu',cv_read)
cv2.waitKey(0)
#不使用opencv
from PIL import Image
I = Image.open('D:\myworkspace\hutao.png')
I.show()
L = I.convert('L')
L.show()
2.转化为HSV HSL
HSV
import cv2 as cv
image = cv.imread('hutao.png')
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
# 显示图片
cv.imshow('hsv', hsv)
# 等待键盘输入
cv.waitKey(0)
HSL
import cv2
import numpy as npdef rgbtohsi(rgb_lwpImg):rows = int(rgb_lwpImg.shape[0])cols = int(rgb_lwpImg.shape[1])b, g, r = cv2.split(rgb_lwpImg)# 归一化到[0,1]b = b / 255.0g = g / 255.0r = r / 255.0hsi_lwpImg = rgb_lwpImg.copy()H, S, I = cv2.split(hsi_lwpImg)for i in range(rows):for j in range(cols):num = 0.5 * ((r[i, j]-g[i, j])+(r[i, j]-b[i, j]))den = np.sqrt((r[i, j]-g[i, j])**2+(r[i, j]-b[i, j])*(g[i, j]-b[i, j]))theta = float(np.arccos(num/den))if den == 0:H = 0elif b[i, j] <= g[i, j]:H = thetaelse:H = 2*3.14169265 - thetamin_RGB = min(min(b[i, j], g[i, j]), r[i, j])sum = b[i, j]+g[i, j]+r[i, j]if sum == 0:S = 0else:S = 1 - 3*min_RGB/sumH = H/(2*3.14159265)I = sum/3.0# 输出HSI图像,扩充到255以方便显示,一般H分量在[0,2pi]之间,S和I在[0,1]之间hsi_lwpImg[i, j, 0] = H*255hsi_lwpImg[i, j, 1] = S*255hsi_lwpImg[i, j, 2] = I*255return hsi_lwpImgif __name__ == '__main__':rgb_lwpImg = cv2.imread("D:\myworkspace\hutao.png")hsi_lwpImg = rgbtohsi(rgb_lwpImg)cv2.imshow('rgb_lwpImg', rgb_lwpImg)cv2.imshow('hsi_lwpImg', hsi_lwpImg)key = cv2.waitKey(0) & 0xFFif key == ord('q'):cv2.destroyAllWindows()
二、车牌切割
车牌案例:
1.读取
#导入相关包
import cv2
import numpy as np
import os
pic_folder='D:\myworkspace\'
pic_one="粤WME58N.BMP"
save_path='D:\myworkspace\plate_cutting\'
#创建文件夹
def mkdir(path):folder=os.path.exists(path)if not folder:#判断是否存在os.makedirs(path)
#图片路径构建及创建文件夹
plate_numbers=pic_folder+pic_one
s_path=save_path+pic_one
mkdir(s_path)plate=cv2.imdecode(np.fromfile(plate_numbers,dtype=np.uint8),-1)
cv2.imshow("cell",plate)
cv2.waitKey(0)
2.灰度化和二值化
#对图片进行处理,进行二值化
plate_gauss=cv2.GaussianBlur(plate,(5,5),0)#高斯降噪
plate_gray=cv2.cvtColor(plate_gauss,cv2.COLOR_BGR2GRAY)#灰度化
thre,plate_bw=cv2.threshold(plate_gray,170,255,cv2.THRESH_BINARY)#二值化
cv2.imshow("cell",plate_bw)
cv2.waitKey(0)
3.闭运算
#闭运算,填充空洞
#构造一个全1的5*5的矩阵
kernel=np.ones((8,8),int)#设置形态学操作卷积的大小
plate_close=cv2.morphologyEx(plate_bw,cv2.MORPH_CLOSE,kernel)
cv2.imshow("cell",plate_close)
cv2.waitKey(0)
4.腐蚀(去掉螺丝孔带来的影响)
#腐蚀运算,消除掉中间那颗螺丝的影响
#构造一个全1的5*5的矩阵
kernel=np.ones((3,3),int)#设置形态学操作卷积的大小
plate_corr=cv2.erode(plate_close,kernel,iterations=1)
cv2.imshow("cell",plate_corr)
cv2.waitKey(0)
5.切割保存
#切割图片并保存
def cutting(start,end,order,src,path):dst=src[:,start-3:end+3]file_name=path+str(order)+'.jpg'cv2.imencode(".jpg",dst)[1].tofile(file_name)
image,plate_count,hir=cv2.findContours(plate_corr,cv2.RETR_EXTERNAL ,cv2.CHAIN_APPROX_NONE)
#检测所有轮廓,所有轮廓建立一个等级树结构。
plate_read=cv2.imdecode(np.fromfile(plate_numbers,dtype=np.uint8),-1)
result=plate_read
for i in range(len(plate_count)):cnt=plate_count[i]x,y,w,h=cv2.boundingRect(cnt)save_path_o=s_path+'/opencv/'mkdir(save_path_o)cutting(x,x+w,i,plate_read,save_path_o)
链接
颜色空间转换及切割车牌(python)
RGB转换HSL,HSV及切割车牌相关推荐
- rgb转hsl,红绿蓝转色调饱和度亮度(颜色转换,c#)
现在工业彩色相机越来越普及,经常会遇到解读颜色,即就是色调hue,所以我们经常会把常用的rgb转换hsl,h就是色调,颜色.h的定义0-360,如下: 用到的转换公式如下: 翻译成c#代码,总感觉效果 ...
- php: RGB 转 HSB(HSV)
前言 最近因为涉及到一个算色规则,其中需要把RGB转HSB的要求,所以自己研究了下,故此记录下. 什么是RGB? RGB表示红色(R).绿色(G).蓝色(B),又称为三原色光.它是通过对三个颜色通道的 ...
- Atitit 从 RGB 到 HSL 或 HSV 的转换
Atitit 从 RGB 到 HSL 或 HSV 的转换 1.1. 从 RGB 到 HSL 或 HSV 的转换公式与原理1 1.2. public static HSV RGB2HSV(Color ...
- 颜色空间转换及切割车牌(python)
如愿 一.前置准备 二.颜色空间转换 2.1 转为灰度图片 三.切割车牌 四.总结 五.参考资料 一.前置准备 软件及使用库 python 3.8.12 opencv 3.4.11 图片 二.颜色空间 ...
- 前端需要了解的颜色模型,RGB、HSL和HSV
目录 RGB模型 RGB颜色值 rgb 转 hex hex 转 rgb HSL模型 HSV(B)模型 RGB 与 HSL 的转换 rgb 转 hsl hsl 转 rgb 颜色模型,是用来表示颜色的数学 ...
- python使用openCV加载图像、并将BGR格式转换成HSV格式、定义HSV格式中需要分离颜色的掩码(掩模)区间(mask)、并使用mask信息进行颜色分离、BGR格式的图像转化为RGB、并可视化
python使用openCV加载图像.并将BGR格式转换成HSV格式.定义HSV格式中需要分离颜色的掩码(掩模)区间(mask).并使用mask信息进行颜色分离.将BGR格式的图像转化为RGB.可视化 ...
- 使用Opencv将RGB颜色空间转换到HSV颜色空间/灰度图
一. 使用cvCvtColor函数将RGB颜色空间转换到HSV颜色空间 所需函数: 1.cvCvtColor 函数功能:颜色空间转换 函数原型: void cvCvtColor( const CvAr ...
- c++ opencv 彩色图rgb 转换hsv 再通道分离
c++ opencv 彩色图rgb 转换hsv 再通道分离 // An highlighted block Mat img_hsv;cvtColor(img, img_hsv, COLOR_BGR2H ...
- 使用MFC实现将图像的RGB值转换到HSV空间,同时进行调节HSV,再将调节后的HSV值传进去转换到RGB空间实现图像在HSV空间中的色度、饱和度、亮度的调节
工程上传到了github ,之前有一版忘记推送了,现在这个链接应该是没问题的了 工程的github链接 希望能帮到你. 文章内容: 1.回顾上文 2.实验步骤&要点提示&代码分析 3. ...
最新文章
- 项目经理如何有效地进行项目沟通?
- BPW34F红外光电传感器
- WPF中splashScreen启动程序之前出现一个过程动画的效果
- tableau必知必会之用 Fixed 函数实现客户回购分析
- GPS-nmealib学习
- 字符串或打印输出乱码
- 网狐动态数组CWHArray
- 公网IP的判断和获取
- Delphi语言最好的JSON代码库 mORMot学习笔记1
- linux刻录win10u盘_手把手教你装系统之【制作官方win10安装U盘】
- Java并行计算线程池_干货!线程池+CountDownLatch,实现 多线程并发计算、汇总
- 上海计算机二级python难吗_计算机二级难吗?
- kibana安装与基础用法
- x9此计算机上没有hasp_中琅条码打印软件安装后弹出HASP错误代码处理方法
- mui mysql_mui框架使用心得
- 程序员键盘使用进阶技巧
- 驭龙HIDS的简介,它开源了
- Android UI + Function
- 1,0在js中有可能会等于true和false来去判断的
- 【GCC编译优化系列】究竟什么样的代码会导致函数调用的栈溢出呢?