前言
RGB是一种比较常见的色彩空间类型,除此之外还有一些其他的色彩空间,比如常见的包括GRAY色彩空间(灰度图像)、XYZ色彩空间、YCrCb色彩空间、HSV色彩空间、HLS色彩空间、CIELab色彩空间、CIELuv色彩空间、Bayer色彩空间等。每个色彩空间都有自己擅长的领域,因此,为了更方面的处理某个具体问题需要用到色彩空间的类型转换。
色彩空间类型转换是指,将一个色彩空间转换为另一个色彩空间。例如,在进行图像的特征提取、距离计算时,往往先将图像从RGB色彩空间转换灰度色彩空间。一些应用中,可能将色彩空间的图像转换为二值图像。详情
图像类型转换
**将图像在BGR模式与RGB模式之间转换**
import cv2
import numpy as np
img1=cv2.imread("pig.jpg")
rgb = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)#图像类型转换函数
cv2.imshow("BGR",img1)
cv2.imshow("RGB",rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()
**将图像在BGR模式与GRAY模式之间转换**
gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
cv2.imshow("GRAY",gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
重点:颜色通道分离
print(f"BGR图像的shape为{bgr.shape}")
print(f"GRAY图像的shape为{gray.shape}")
#结果:[BGR图像的shape为(500, 500, 3)
#GRAY图像的shape为(500, 500)]
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图像颜色通道分离
bgr2 = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
cv2.imshow("after",bgr2)
cv2.waitKey(0)
cv2.destroyAllWindows()
Colorsplit(bgr2)#将转换后的RGB图像颜色通道分离
结论:GRAY转换为BRG颜色空间,各通道值相同
import cv2
import numpy as np
img2=cv2.imread("pig.jpg")
cv2.imshow("SRC",img2)
hsv = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)#图像类型转换函数
cv2.imshow("HSV",hsv)
lowerb_hsv = np.array([156,43,46])#要识别颜色的下限
upperb_hsv = np.array([180,255,255])#要识别的颜色的上限
mask = cv2.inRange(hsv, lowerb_hsv, upperb_hsv)
cv2.imshow("MASK",mask)
cv2.waitKey(0)
cv2.destroyAllWindows()
red = cv2.bitwise_and(img2,img2,mask=mask)
cv2.imshow("RED",red)
cv2.waitKey(0)
cv2.destroyAllWindows()
提取图像中的绿色和蓝色区域,和提取图像中的红色区域差不多,这里不做展开,运用好这些就可以自己做滤镜特效
突如其来的案例:图像怀旧特效
#coding:utf-8
import cv2 as cv
import numpy as np
#读取原始图像
img = cv.imread('pig.jpg')
#获取图像行和列
rows, cols = img.shape[:2]
#新建目标图像
dst = np.zeros((rows, cols, 3), dtype="uint8")
#图像怀旧特效
for i in range(rows):
for j in range(cols):
B = 0.272*img[i,j][2] + 0.534*img[i,j][1] + 0.131*img[i,j][0]
G = 0.349*img[i,j][2] + 0.686*img[i,j][1] + 0.168*img[i,j][0]
R = 0.393*img[i,j][2] + 0.769*img[i,j][1] + 0.189*img[i,j][0]
if B>255:
B = 255
if G>255:
G = 255
if R>255:
R = 255
dst[i,j] = np.uint8((B, G, R))
#显示图像
#cv.imshow('result',np.vstack((img,dst)))
cv.imshow('img',img)
cv.imshow('result',dst)
cv.waitKey()
cv.destroyAllWindows()