首先,我们先来了解下有关颜色的基本概念
1、彩色的三要素 亮度:即人眼对光的明亮程度的感受。 色调:人眼能看到的颜色种类,与光的波长有关 饱和度:颜色深浅程度。与各种颜色混入白光的比例有关。 以上 色调 + 饱和度 = 色度
2、三基色原理 三基色可以通过适当比例的混合组成自然界中任何一种颜色
由于人眼对于红绿蓝三种色光最为敏感,并且由这三种颜色能组成的颜色范围最广,故一般选用RGB作为三基色
但是,三基色并不是唯一的,只要满足任何一种颜色都不能由其他两种颜色合成即可组成三基色。例如,我们还可以用黄色,品红,青色组成三基色。
3、亮度的组成
4、常用的四种颜色空间
任意的彩色光F都有一个配色的公式:F = r[R]+g[G]+b[B] 式中r,g,b为系数,r+g+b=1。故,知其二便可唯一确定色调。
而采用YUV颜色空间的好处有:
a、解决了彩色电视机和黑白电视机的兼容问题(因为黑白电视机只需要提取信号中的Y信号即可显示出来)
b、可以节省传输带宽 一般情况下,数字化后的 Y:U:V = 8:4:4或者Y:U:V = 8:2:2,即亮度信号Y需要8比特表示,UV需要4个或者2个比特表示,我们知道,RGB颜色空间下,需要24比特来表示一个颜色,而利用YUV则仅需要16比特或者12比特,达到压缩的目的。
在PAL制下,白光亮度Y和红绿蓝三色光的关系可以用以下公式表示: Y = 0.222R + 0.707G + 0.071B 在NTSC制下,Y=0.299R+0.587G+0.114B
色差U,即蓝基色分量与亮度的差值信号,可以用以下公式表示: U = k1(B – Y) 色差V,即红基色分量与亮度的差值信号,可以用以下公式表示: V = k2(R – Y) 通常,k1 = 0.493,k2 = 0.877
YUV颜色空间与RGB颜色空间的转换
如上图所示,YIQ颜色空间被NTSC制的彩色电视机使用。 其中Y还是亮度信号,用👇公式表示: Y = 0.299R + 0.587G + 0.114B
I代表人眼敏感的色彩色差信号,用👇公式表示: I = 0.596R – 0.275G – 0.321B’
Q代表人眼不敏感的色差信号,用👇公式表示: Q = 0.212R – 0.523G + 0.311B
上图为博客:https://www.cnblogs.com/faith0217/articles/4264652.html 中的内容
以下程序利用python实现
import math
import numpy as np
from PIL import Image
imgpath = 'C:/Users/11037/Desktop/7.jpg' #图片路径
m_yuv = np.mat([[0.299,0.587,0.114],[-0.299,-0.587,0.886],[0.701,-0.587,-0.114]])
m_yiq = np.mat([[0.299,0.587,0.114],[0.596,-0.274,-0.322],[0.211,-0.524,0.312]])
def rgb2yuv(need_rgb):
ans = list([int(i) for i in m_yuv*need_rgb])
return ans
def yuv2rgb(need_yuv):
m = m_yuv.I
ans = list([int(i) for i in m*need_yuv])
return ans
def rgb2yiq(need_rgb):
ans = list([int(i) for i in m_yiq*need_rgb])
return ans
def yiq2rgb(need_yiq):
m = m_yiq.I
ans = list([int(i) for i in m*need_yiq])
return ans
'''
def rgb2hsi(need_rgb:np.mat):
rgb = list(need_rgb)
r,g,b = int(rgb[0]),int(rgb[1]),int(rgb[2])
theta = math.acos((((r-g)+(r-b))/2)/math.sqrt((r-g)**2+(r-b)*(g-b)))
print('theta',theta)
if b<=g:
h = theta
else:
h = 360-theta
s = 1-3*min(r,g,b)/(r+g+b)
i = (r+g+b)/3
return (h,s,i)
'''
img = Image.open(imgpath)
img = np.array(img)
print(img.shape)
x = int(input('请输入x:'))
y = int(input('请输入y:'))
testrgb = np.mat(img[x,y]).T
rgb2 = rgb2yuv(testrgb)
print('需要转换的rgb为:\n',testrgb)
print('rgb转yuv:',rgb2)
print('yuv转rgb:',yuv2rgb(np.mat(rgb2).T))
1、代码
import math
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
imgpath = '' #图片路径
img = cv.imread(imgpath)
imggray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
imghsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
imgyuv = cv.cvtColor(img,cv.COLOR_BGR2YUV)
plt.subplot(221),plt.imshow(img),plt.title('img')
plt.subplot(222),plt.imshow(imggray),plt.title('imggray')
plt.subplot(223),plt.imshow(imghsv),plt.title('imghsv')
plt.subplot(224),plt.imshow(imgyuv),plt.title('imgyuv')
plt.show()
效果:
若发现错误请给予指出,谢谢~
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/219103.html原文链接:https://javaforall.cn