文章目錄
- 一、色調和彩色校正
- 二、色調校正及彩色平衡
- 三、彩色直方圖均衡化
-基于Python+OpenCV,實驗環境:pycharm+anaconda,參考《數字影像處理》岡薩雷斯第四版(初學影像處理和Python,歡迎指出錯誤~)
一、色調和彩色校正
彩色影像可以看做不同彩色通道影像的疊加,每一個通道都可以同灰度影像處理一樣進行操作,由于numpy的矩陣操作功能很強大,所以處理彩色影像也是比較方便的,若采用伽馬變換,影像較亮,應該選擇γ>1,壓縮高灰度級,影像較暗,應選擇γ<1,擴展低灰度級,增強對比度,
若采用S函式(對比度拉伸變換函式),選擇合適的引數(斜率),能得到較高的對比度,S函式運算式為:s=T(r)=1/(1+(M/r)^E)
s是輸出灰度,r是輸入灰度,M是控制的灰度中值,E控制函式斜率,形狀如下:

代碼如下:
# -*- coding:utf-8 -*-
"""
作者:YJH
日期:2021年11月05日
"""
import matplotlib.pyplot as plt
import cv2 as cv
import numpy as np
from 彩色空間轉換 import hsi2rgb # 從前面寫的一個檔案里匯入自定義的兩個函式
from 彩色空間轉換 import rgb2hsi
# 顯示漢字用
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 定義坐標數字字體及大小
def label_def():
plt.xticks(fontproperties='Times New Roman', size=8)
plt.yticks(fontproperties='Times New Roman', size=8)
# plt.axis('off') # 關坐標,可選
if __name__ == '__main__':
# 讀取圖片
img_orig = cv.imread('top_ left_flower.tif', 1) # 讀取彩色圖片
# ------------------------------------------------色調校正---------------------------------------------------------#
# 伽馬變換處理
img_gama = np.power(img_orig.astype(np.float32), 1.5) # 影像較亮,若采用冪率變換,γ>1,壓縮高灰度級
temp1 = img_gama - np.min(img_gama)
img_gama = temp1/np.max(temp1)
# 對比度拉伸變換函式
med = np.median(img_orig.astype(np.float32)) # 獲取中值M
img_temp = 1 / (1 + np.power((140/(img_orig+1e-6)), 4.5)) # 4.5為斜率,互動式選擇(感覺med效果不如140)
temp2 = img_temp - np.min(img_temp) # 標定到[0~255],才能進行BGR2RGB
img_con_str = np.uint8(255*(temp2/np.max(temp2)))
# 顯示所用的變換函式
x1 = np.linspace(img_orig.min(), img_orig.max(), num=200)
y1 = np.power(x1, 1.5) # 伽馬函式
x2 = np.linspace(img_orig.min(), img_orig.max(), num=200)
y2 = 1 / (1 + np.power((med/(x2+1e-6)), 4.5)) # 對比度拉伸函式
plt.subplot(231), plt.title('原影像'), plt.imshow(cv.cvtColor(img_orig, cv.COLOR_BGR2RGB)), plt.axis('off')
plt.subplot(232), plt.title('伽馬變換'), plt.imshow(cv.cvtColor(img_gama, cv.COLOR_BGR2RGB)), plt.axis('off')
plt.subplot(233), plt.title('對比度拉伸'), plt.imshow(cv.cvtColor(img_con_str, cv.COLOR_BGR2RGB)), plt.axis('off')
plt.subplot(235), plt.title('s=r**(1.5)'), plt.plot(x1, y1), plt.grid(), label_def()
plt.subplot(236), plt.title('s=1/(1+(M/r)**4)'), plt.plot(x2, y2), plt.grid(), label_def()
plt.show()
效果如下:

二、色調校正及彩色平衡
只經過色調校正并不總能得到滿意的結果,常用的處理方法是:
(1)色調校正;(2)彩色平衡校正,
比如下圖較暗,所以用γ<1(0.5)的伽馬變換來擴展低灰度級,但變換后影像中(前方石頭和雜草)偏紅色,所以轉到CMY空間,對M分量進行平衡,代碼如下:(用到的rgb2hsi和hsi2rgb是我自己定義的兩個彩色空間變換函式,可以見我另一篇文章彩色空間HSI和RGB變換)
# 接上面的代碼
# --------------------------------------------彩色平衡---------------------------------------------------------------#
img_stone = cv.imread('bottom_left_stream.tif', 1)
# 伽馬變換處理
stone_gama = np.power(img_stone.astype(np.float32), 0.5) # 影像較暗,若采用冪率變換,γ<1,拉伸低灰度級,互動式選擇
temp = stone_gama - np.min(stone_gama)
stone_gama = temp/np.max(temp)
img_cmy = 1 - cv.cvtColor(stone_gama, cv.COLOR_BGR2RGB)
c, m, y = cv.split(img_cmy)
# print(m.shape)
m_gama = np.power(m.astype(np.float32), 1.08) # 深紅色較多,壓縮一下
temp_m = m_gama - np.min(m_gama)
m_gama = (temp_m/(np.max(temp_m)))
out_stone = 1 - cv.merge((c, m_gama, y))
plt.subplot(131), plt.title('原影像'), plt.imshow(cv.cvtColor(img_stone, cv.COLOR_BGR2RGB)), plt.axis('off')
plt.subplot(132), plt.title('伽馬變換'), plt.imshow(cv.cvtColor(stone_gama, cv.COLOR_BGR2RGB)), plt.axis('off')
plt.subplot(133), plt.title('彩色平衡(深紅色)'), plt.imshow(out_stone), plt.axis('off')
plt.show()
效果如下(好像不明顯還行吧)

三、彩色直方圖均衡化
同灰度圖一樣,可以直接用函式cv2.equalizeHist(img),操作RGB每個平面或者HSI空間的I分量,但是這個函式操作物件灰度級要是8bit的,對于[0,1]的灰度級要標定到[0,255],要注意一下,
HSI空間中I分量直方圖均衡化后,雖不改變H和S分量,但會影響影像整體顏色,常用處理是先均衡化,再調整飽和度分量S,
代碼如下:
# ------------------------彩色直方圖均衡化----------------------------#
img_caster = cv.imread('caster_stand_original.tif', 1)
h, s, i, caster = rgb2hsi(img_caster)
img = np.float32(caster)
i = np.uint8(255*i)
equ_i = (cv.equalizeHist(i))/255.0 # 均衡化亮度分量
# plt.subplot(121), plt.imshow(i, 'gray')
# plt.subplot(122), plt.imshow(equ_i, 'gray')
# plt.show()
img_equ1 = hsi2rgb(cv.merge((h, s, equ_i)))
# add_s = np.where((s*2) > 1, s, (s*1.5)) # 增飽和度
add_s = np.power(s, 0.85)
img_equ2 = hsi2rgb(cv.merge((h, add_s, equ_i)))
plt.subplot(131), plt.title('原影像'), plt.imshow(cv.cvtColor(img_caster, cv.COLOR_BGR2RGB)), plt.axis('off')
plt.subplot(132), plt.title('I分量直方圖均衡'), plt.imshow(img_equ1), plt.axis('off')
plt.subplot(133), plt.title('均衡I+增大S'), plt.imshow(img_equ2), plt.axis('off')
plt.show()
效果如下(找不同…):

歡迎大家批評指正
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/350752.html
標籤:其他
下一篇:NLP基礎知識之語音識別
