OpenCV图像处理和应用—色彩空间与几何变换(一)

前言

RGB是一种比较常见的色彩空间类型,除此之外还有一些其他的色彩空间,比如常见的包括GRAY色彩空间(灰度图像)、XYZ色彩空间、YCrCb色彩空间、HSV色彩空间、HLS色彩空间、CIELab色彩空间、CIELuv色彩空间、Bayer色彩空间等。每个色彩空间都有自己擅长的领域,因此,为了更方面的处理某个具体问题需要用到色彩空间的类型转换。

色彩空间类型转换是指,将一个色彩空间转换为另一个色彩空间。例如,在进行图像的特征提取、距离计算时,往往先将图像从RGB色彩空间转换灰度色彩空间。一些应用中,可能将色彩空间的图像转换为二值图像。详情

© Fu Xianjun. All Rights Reserved.

正文

图像类型转换

**将图像在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颜色空间,各通道值相同

提取指定颜色

提取图像中的红色区域
OpenCV图像处理和应用—色彩空间与几何变换(一)_第1张图片

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()

提取图像中的绿色和蓝色区域,和提取图像中的红色区域差不多,这里不做展开,运用好这些就可以自己做滤镜特效

突如其来的案例:图像怀旧特效

OpenCV图像处理和应用—色彩空间与几何变换(一)_第2张图片

#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()

效果图
OpenCV图像处理和应用—色彩空间与几何变换(一)_第3张图片

你可能感兴趣的:(OpenCV,opencv)