【Python3+OpenCV】實現圖像處理—灰度變換篇


OpenCV是一個C++庫,目前流行的計算機視覺編程庫,用於實時處理計算機視覺方面的問題,它涵蓋了很多計算機視覺領域的模塊。在Python中常使用OpenCV庫實現圖像處理。

本文將介紹如何在Python3中使用OpenCV實現對圖像處理的灰度變換:

灰度化處理,二值化處理,伽馬變換,對數變換,反向變換

 

 

電腦環境准備

Python版本:

Python3.7

 

OpenCV版本:

OpenCV4.1

 

 

知識准備

一張圖片是由像素點矩陣構成,我們對圖片進行操作即為對圖片的像素點矩陣進行操作。我們只要在這個像素點矩陣中找到這個像素點的位置,比如第x行,第y列。所以這個像素點在這個像素點矩陣中的位置就可以表示成(x,y)

同時因為一個像素點的顏色通常包括R、G、B三個分量,分別顯示出紅、綠、藍三個顏色,灰度化就是使彩色圖像的R、G、B三個分量相等的過程。灰度圖像中每個像素僅具有一種樣本顏色,其灰度是位於黑色與白色之間的多級色彩深度,灰度值大的像素點比較亮,反之比較暗,像素值最大為255(表示白色),像素值最小為0(表示黑色)。

 

No.1

灰度化處理

Opencv中圖片的灰度化:將一個像素點的三個顏色變量相等,R=G=B,此時該值稱為灰度值。

本文提供的灰度化處理有兩種方法(灰度化處理不止這兩種)

方法1:直接將原圖讀成灰度圖像

img1=cv2.imread('girl.png',0)
方法2:將原圖進行灰度化處理
#灰度化處理2:
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
import cv2

#讀入原始圖像
img=cv2.imread('girl.png',1)

#灰度化處理1:直接讀入灰度化圖像
img1=cv2.imread('girl.png',0)

#灰度化處理2:
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#通過窗口展示圖片 第一個參數為窗口名 第二個為讀取的圖片變量
cv2.imshow('img',img)
cv2.imshow('gray1',img1)
cv2.imshow('gray2',gray)

#暫停cv2模塊 不然圖片窗口一瞬間即就會消失 觀察不到
cv2.waitKey(0)
運行程序后,顯示如下:

 

No.2

二值化處理

Opencv中的圖像的二值化,就是將圖像上的像素點的灰度值設置為0或255,也就是將整個圖像呈現出明顯的只有黑和白的視覺效果。

cv.threshold ()函數是圖像二值化函數

其中,第二個參數是判定像素點的臨界值。超過了這個點,將會被划分為255,低於這個點,將會被划分為0。具體的參數0~255可以自行根據需要調節。

import cv2

#讀入原始圖像
img=cv2.imread('girl.png',1)

#灰度化處理
img1=gray.copy()

#灰度化處理:此灰度化處理用於圖像二值化
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#二值化函數
cv2.threshold(gray,140,255,0,gray)#二值化函數

#通過窗口展示圖片 第一個參數為窗口名 第二個為讀取的圖片變量
cv2.imshow('img',img)
cv2.imshow('gray',img1)
cv2.imshow('Binarization',gray)

#暫停cv2模塊 不然圖片窗口一瞬間即就會消失 觀察不到
cv2.waitKey(0)
運行程序后,顯示如下:

 

No.3

灰度圖像的伽馬變換

Opencv中的伽馬變換是用來圖像增強,提升了暗部細節,簡單來說就是通過非線性變換,讓圖像從暴光強度的線性響應變得更接近人眼感受的響應,即將漂白(相機曝光)或過暗(曝光不足)的圖片,進行矯正。

伽馬值小於1時,會拉伸圖像中灰度級較低的區域,同時會壓縮灰度級較高的部分

伽馬值大於1時,會拉伸圖像中灰度級較高的區域,同時會壓縮灰度級較低的部分

import cv2
import copy

#讀入原始圖像
img=cv2.imread('girl.png',1)

#灰度化處理
img1=cv2.imread('girl.png',0)

#灰度化處理:此灰度化處理用於圖像二值化
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#伽馬變換
gamma=copy.deepcopy(gray)
rows=img.shape[0]
cols=img.shape[1]
for i in range(rows):
for j in range(cols):
gamma[i][j]=3*pow(gamma[i][j],0.8)

#通過窗口展示圖片 第一個參數為窗口名 第二個為讀取的圖片變量
cv2.imshow('img',img)
cv2.imshow('gray',img1)
cv2.imshow('gamma',gamma)

#暫停cv2模塊 不然圖片窗口一瞬間即就會消失 觀察不到
cv2.waitKey(0)
運行程序后,顯示如下:

 

No.4

灰度圖像的對數變換

Opencv中的對數變換:由於對數曲線在像素值較低的區域斜率大,在像素值較高的區域斜率較小,所以圖像經過對數變換后,較暗區域的對比度將有所提升。可用於增強圖像的暗部細節。

灰度圖像的對數變換一般表示如公式所示:

DB=C*log(1+ DA)

其中c為尺度比較常數,DA為原始圖像灰度值,DB為變換后的目標灰度值。

如下圖所示,它表示對數曲線下的灰度值變化情況。

 

由於對數曲線在像素值較低的區域斜率大,在像素值較高的區域斜率較小,所以圖像經過對數變換后,較暗區域的對比度將有所提升。這種變換可用於增強圖像的暗部細節,從而用來擴展被壓縮的高值圖像中的較暗像素。

對數變換實現了擴展低灰度值而壓縮高灰度值的效果,被廣泛地應用於頻譜圖像的顯示中。一個典型的應用是傅立葉頻譜,其動態范圍可能寬達0~106直接顯示頻譜時,圖像顯示設備的動態范圍往往不能滿足要求,從而丟失大量的暗部細節;而在使用對數變換之后,圖像的動態范圍被合理地非線性壓縮,從而可以清晰地顯示。

import cv2
import copy
import math

#讀入原始圖像
img=cv2.imread('girl.png',1)

#灰度化處理
img1=cv2.imread('girl.png',0)

#灰度化處理:此灰度化處理用於圖像二值化
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 對數變換
logc = copy.deepcopy(gray)
rows=img.shape[0]
cols=img.shape[1]
for i in range(rows):
for j in range(cols):
logc[i][j] = 3 * math.log(1 + logc[i][j])

#通過窗口展示圖片 第一個參數為窗口名 第二個為讀取的圖片變量
cv2.imshow('img',img)
cv2.imshow('gray',img1)
cv2.imshow('logc',logc)

#暫停cv2模塊 不然圖片窗口一瞬間即就會消失 觀察不到
cv2.waitKey(0)
運行程序后,顯示如下:

 

No.5

灰度圖像的反色變換

Opencv中的反色變換:對原圖像像素值的顏色進行反轉,即黑色變為白色,白色變為黑色。

import cv2
import copy
import math

#讀入原始圖像
img=cv2.imread('girl.png',1)

#灰度化處理
img1=cv2.imread('girl.png',0)

#灰度化處理:此灰度化處理用於圖像二值化
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 反色變換
cover=copy.deepcopy(gray)
rows=img.shape[0]
cols=img.shape[1]
for i in range(rows):
for j in range(cols):
cover[i][j]=255-cover[i][j]

#通過窗口展示圖片 第一個參數為窗口名 第二個為讀取的圖片變量
cv2.imshow('img',img)
cv2.imshow('gray',img1)
cv2.imshow('cover',cover)

#暫停cv2模塊 不然圖片窗口一瞬間即就會消失 觀察不到
cv2.waitKey(0)
運行程序后,顯示如下:

 

 

 


————————————————
轉載:https://blog.csdn.net/weixin_44447791/article/details/105672447


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM