数字图像处理——第六章 彩色图像处理
數字圖像處理——第六章 彩色圖像處理
文章目錄
- 數字圖像處理——第六章 彩色圖像處理
- 1 彩色模型
- 1.1 RGB彩色模型
- 1.2 CMY 和CMYK彩色模型
- 1.3 HSI彩色模型
- 2 偽彩色圖像處理
- 2.1 灰度分層
- 2.2 灰度到彩色的變換
- 3 彩色圖像的分割
- 3.1 RGB中的彩色圖像分割
- 3.2 彩色邊緣檢測
1 彩色模型
1.1 RGB彩色模型
RGB模型是工業界的一種顏色標準. 是通過對紅(Red)、綠(Green)、藍(Blue)3種顏色亮度的變化以及它們相互之間的疊加來得到各種各樣的顏色。RGB彩色空間對應的坐標系統是如圖所示的立方體
其實在緒論中就有說過彩色圖像的相關知識,復習億下。
像素:數字圖像由二維的元素組成,每一個元素具有一個特定的位置(x,y)和幅值f(x,y),這些元素就稱為像素,它是數字圖像的基本單位。
彩色圖像:用紅、綠、藍三元組的二維矩陣來表示。三元組的每個數值也是在0-255之間,0表示相應的基色在該像素中沒有,而255表示相應的基色在該像素中取得最大值,所以越接近0越黑,越接近255越白。
利用python提取出RGB三通道圖像:
代碼如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
img = cv2.imread(' ')
plt.figure(dpi = 180)plt.subplot(141)
plt.imshow(img)
plt.title("原圖")
plt.subplot(142)
plt.imshow(img[:, :, 0])
plt.title("B")plt.subplot(143)
plt.imshow(img[:, :, 1])
plt.title("G")plt.subplot(144)
plt.imshow(img[:, :, 2])
plt.title("R")
plt.tight_layout()
plt.show()
實驗結論:首先有個小問題,可以看出原圖和真正的原圖長得不一樣, 這是因為我讀取的方式采用的是opencv,而show采用的是matplotlib,這兩者接口的模式不一致。opencv 的接口使用BGR模式,而 matplotlib.pyplot 接口使用的是RGB模式。所以上述原圖長得不像原圖。解決方法,從opencv讀取后轉成RGB格式 img = img[:, :, [2, 1, 0]]即可,如下所示
只需要在上述代碼中讀取img之后,加入 img = img[:, :, [2, 1, 0]]即可。
1.2 CMY 和CMYK彩色模型
CMY是青(Cyan)、洋紅或品紅(Magenta)和黃(Yellow)三種顏色的簡寫,是相減混色模式,用這種方法產生的顏色之所以稱為相減色,乃是因為它減少了為視覺系統識別顏色所需要的反射光。和RGB的區別在于:RGB是紅(Red)、綠(Green)和藍(Blue)三種顏色的簡寫,是相加混色模式,每種顏色分量越多,得到的顏色越亮,每種顏色的取值范圍為0~255;RGB常用于計算機顯示方面。
由于彩色墨水和顏料的化學特性,用三種基本色得到的黑色不是純黑色,因此在印刷術中,常常加一種真正的黑色(black ink),這種模型稱為CMYK模型,廣泛應用于印刷術。每種顏色分量的取值范圍為0~100;CMY常用于紙張彩色打印方面。
CMY和RGB其實是互補的顏色類型。
[CMY]=[111]?[RGB]\left[\begin{array}{c} C \\ M \\ Y \end{array}\right]=\left[\begin{array}{l} 1 \\ 1 \\ 1 \end{array}\right]-\left[\begin{array}{l} R \\ G \\ B \end{array}\right] ???CMY????=???111????????RGB????
以上假設所有的顏色全部歸一化到了[0,1]之間,C M Y 主要表示顏料的表面所反射的顏色,上式表明涂有青色顏料的表面所反射的光中不包含紅色,類似的,純深紅色不反射綠色,純黃色不反射藍色。所以CMY其實就是RGB的補色。
因為CMY所組合的顏色不是純黑,所以為了產生真正的黑色,我們一般在模型里面加入CMYK的k即代表黑色。
1.3 HSI彩色模型
色調H(Hue):與光波的波長有關,它表示人的感官對不同顏色的感受,如紅色、綠色、藍色等,它也可表示一定范圍的顏色,如暖色、冷色等。
飽和度S(Saturation):表示顏色的純度,純光譜色是完全飽和的,加入白光會稀釋飽和度。飽和度越大,顏色看起來就會越鮮艷,反之亦然。
亮度I(Intensity):對應成像亮度和圖像灰度,是顏色的明亮程度。
HSI是指一個數字圖像的模型,它反映了人的視覺系統感知彩色的方式,以色調、飽和度和亮度三種基本特征量來感知顏色。HSI模型的建立基于兩個重要的事實:
第一個,分量與圖像的彩色信息無關;
第二個,H和S分量與人感受顏色的方式是緊密相聯的。這些特點使得HSI模型非常適合彩色特性檢測與分析。
從RGB空間到HSI空間的轉換,即分別求出HSI參數
代碼如下:
def RGB2HSI(rgb_img):"""傳入RGB乳香,返回HSI圖像"""#保存原始圖像的行列數row = np.shape(rgb_img)[0]col = np.shape(rgb_img)[1]#對原始圖像進行復制hsi_img = rgb_img.copy()#對圖像進行通道拆分B,G,R = cv2.split(rgb_img)#把通道歸一化到[0,1][B,G,R] = [ i/ 255.0 for i in ([B,G,R])]H = np.zeros((row, col)) #定義H通道I = (R + G + B) / 3.0 #計算I通道S = np.zeros((row,col)) #定義S通道for i in range(row):den = np.sqrt((R[i]-G[i])**2+(R[i]-B[i])*(G[i]-B[i]))thetha = np.arccos(0.5*(R[i]-B[i]+R[i]-G[i])/den) #計算夾角h = np.zeros(col) #定義臨時數組#den>0且G>=B的元素h賦值為thethah[B[i]<=G[i]] = thetha[B[i]<=G[i]]#den>0且G<=B的元素h賦值為thethah[G[i]<B[i]] = 2*np.pi-thetha[G[i]<B[i]]#den<0的元素h賦值為0h[den == 0] = 0H[i] = h/(2*np.pi) #弧度化后賦值給H通道#計算S通道for i in range(row):min = []#找出每組RGB值的最小值for j in range(col):arr = [B[i][j],G[i][j],R[i][j]]min.append(np.min(arr))min = np.array(min)#計算S通道S[i] = 1 - min*3/(R[i]+B[i]+G[i])#I為0的值直接賦值0S[i][R[i]+B[i]+G[i] == 0] = 0#擴充到255以方便顯示,一般H分量在[0,2pi]之間,S和I在[0,1]之間hsi_img[:,:,0] = H*255hsi_img[:,:,1] = S*255hsi_img[:,:,2] = I*255return hsi_img
2 偽彩色圖像處理
2.1 灰度分層
偽彩色圖像處理也叫假彩色圖像處理,根據一定的準則對灰度值賦以彩色的處理。
灰度級分層通常用于突出感興趣的特定灰度范圍內的亮度?;叶燃壏謱佑袃纱蠡痉椒?。
- 將感興趣的灰度范圍內的值顯示為一個值(比如0),而其他范圍的值為另外一個值(255)。
- 將感興趣的灰度范圍內的值顯示為一個值(比如0),而其他范圍的值不變。
代碼如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def grayscale_layer(input_image, spotlight_range_min, spotlight_range_max, means):'''灰度級分層:param input_image: 原圖像:param spotlight_range_min: 所突出的灰度級范圍最小值:param spotlight_range_max: 所突出的灰度級范圍最大值:param means: 分層方式(1,2):return: 灰度級分層后的圖像'''input_image_cp = np.copy(input_image) # 輸入圖像的副本if means == 1: # 方式一(突出指定范圍內255,并且變暗非范圍內0)input_image_cp = np.where((input_image_cp >= spotlight_range_min) & (input_image_cp <= spotlight_range_max), 255, 0)elif means == 2: # 方式二(僅突出指定范圍內255)input_image_cp[np.where((input_image_cp >= spotlight_range_min) & (input_image_cp <= spotlight_range_max))] = 255else:print("please enter the number of means from 1 to 2")returnoutput_image = input_image_cpreturn output_image.astypetype(np.uint8)img = cv2.imread(' ')
img = img[:, :, [2, 1, 0]]
plt.figure(dpi = 180)plt.subplot(131)
plt.imshow(img)
plt.title("原圖")plt.subplot(132)
plt.imshow(output_1)
plt.title("output_1")plt.subplot(133)
plt.imshow(output_2)
plt.title("output_2")plt.tight_layout()
plt.show()
2.2 灰度到彩色的變換
首先我們需要一張灰度圖,讀取灰度圖的方式有好幾種,這里用opencv讀取灰度圖,然后用matplotlib顯示。讀取方式為:
img = cv2.imread(' ', 0) # 0代表著以灰度圖的方式讀取
但是直接使用plt顯示圖像,它默認使用三通道顯示圖像。所以你管這綠的叫灰度圖?所以在plt.imshow()添加參數,plt.imshow(img, cmap=“gray”),這樣就能得到正經的灰度圖。
opencv中自帶函數cv2.applyColorMap(img, cv2.COLORMAP_JET)能將灰度圖像轉化成偽彩色圖像,效果如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = Falseimg = cv2.imread('C:/Users/yujunliu/Pictures/Saved Pictures/dongman.jpg', 0)
img = img[:, :, [2, 1, 0]]
im_color = cv2.applyColorMap(img, cv2.COLORMAP_JET)plt.figure(dpi = 100)plt.subplot(121)
plt.imshow(img, cmap = "gray")
plt.title("灰度圖")plt.subplot(122)
plt.imshow(im_color)
plt.title("偽彩色圖像")plt.tight_layout()
plt.show()
3 彩色圖像的分割
彩色空間分割是基于單色圖像(灰度圖)分割技術在不同顏色通道上實現的。灰度圖分割技術常見的有:直方圖閥值化、特征聚類、邊緣檢測、基于區域的、模糊技術、神經網絡等?;叶葓D的分割方法都是基于區域像素的非連續性或相似性?;诜沁B續性的方法主要是為了檢測孤立的點、邊緣、線(灰度突然變化的地方)?;谙嗨菩缘姆椒òㄩy值、聚類、區域分割合并等。
3.1 RGB中的彩色圖像分割
本次目標是將一副圖像從rgb顏色空間轉換到hsv顏色空間,顏色去除白色背景部分具體就調用了cv2的兩個函數,一個是rgb轉hsv的函數,另一個是利用cv2.inRange函數設閾值,去除背景部分。
代碼如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def color_seperate(image):hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) #對目標圖像進行色彩空間轉換#設定藍色下限lower_hsv = np.array([20, 20, 20]) #設定藍色上限upper_hsv = np.array([255, 255, 255]) mask = cv2.inRange(hsv, lowerb=lower_hsv, upperb=upper_hsv) dst = cv2.bitwise_and(image, image, mask=mask) return dstimg = cv2.imread(' ')
out = color_seperate(img)
plt.figure(dpi = 100)plt.subplot(121)
plt.imshow(img)
plt.title("原圖")plt.subplot(122)
plt.imshow(out)
plt.title("output")plt.tight_layout()
plt.show()
核心函數在于cv2.inRange,參數有三個
第一個參數:原圖
第二個參數:lower_red指的是圖像中低于這個lower_red的值,圖像值變為0
第三個參數:upper_red指的是圖像中高于這個upper_red的值,圖像值變為0
而在lower_red~upper_red之間的值變成255
3.2 彩色邊緣檢測
在圖像識別中,需要有邊緣鮮明的圖像,即圖像銳化。圖像銳化的目的是為了突出圖像的邊緣信息,加強圖像的輪廓特征,以便于人眼的觀察和機器識別。圖像邊緣檢測大幅度地減少了數據量,并且剔除了可以認為不相關的信息,保留了圖像重要的結構屬性。本次利用Canny算子來實現邊緣檢測。圖像邊緣檢測必須滿足兩個條件,一能有效地抑制噪聲;二必須盡量精確確定邊緣的位置。根據對信噪比與定位乘積進行測度,得到最優化逼近算子,這就是Canny邊緣檢測算子。
Canny 的目標是找到一個最優的邊緣檢測算法,最優邊緣檢測的含義是:
-
最好的檢測: 算法能夠盡可能多地標識出圖像中的實際邊緣。
-
最好的定位: 標識出的邊緣要盡可能與實際圖像中的實際邊緣盡可能接近。
-
最小的響應:圖像中的邊緣只能標識一次,并且可能存在的圖像噪聲不應標識為邊緣。
這里采用opencv C++版本調用攝像頭實現Candy算子:
代碼如下:
#include <opencv2\opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;int main()
{VideoCapture capture(0);while (1){Mat frame; Mat dstImage, edge, grayImage; //參數定義capture >> frame; //將原圖像轉換為灰度圖像cvtColor(frame, grayImage, CV_BGR2GRAY);//先用使用 3x3內核來降噪blur(grayImage, edge, Size(3, 3));//運行Canny算子Canny(edge, edge, 3, 9, 3);imshow("讀取視頻", edge); waitKey(30);}return 0;
}
總結
以上是生活随笔為你收集整理的数字图像处理——第六章 彩色图像处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字图像处理——第五章 图像复原与重建
- 下一篇: 数字图像处理——第七章 小波和多分辨处理