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


本篇推文共計1000個字,閱讀時間約3分鐘。編程

OpenCV是一個C++庫,目前流行的計算機視覺編程庫,用於實時處理計算機視覺方面的問題,它涵蓋了不少計算機視覺領域的模塊。在Python中常使用OpenCV庫實現圖像處理。
本文將介紹如何在Python3中使用OpenCV實現對圖像處理的灰度變換:
灰度化處理二值化處理 伽馬變換 對數變換 反向變換



電腦環境準備微信


Python版本:
Python3.7


O pen CV 版本
OpenCV4.1


知識準備架構


一張圖片是由像素點矩陣構成,咱們對圖片進行操做即爲對圖片的像素點矩陣進行操做。咱們只要在這個像素點矩陣中找到這個像素點的位置,好比第x行,第y列。因此這個像素點在這個像素點矩陣中的位置就能夠表示成(x,y)app


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



No.1工具

灰度化處理學習


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


本文提供的灰度化處理有兩種方法(灰度化處理不止這兩種)
方法1: 直接將原圖讀成灰度圖像
img1=cv2.imread('girl.png',0)

方法2:將原圖進行灰度化處理

#灰度化處理2:flex

gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)ui


             
               
  
              
              
               
               
                        
               
  
              
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)


運行程序後,顯示以下:


本期推文到此結束,歡迎各位讀者關注本公衆號。


本公衆號將開設【Python3+OpenCV】專題,

並陸續推出相關係列文章,篇篇精彩。

歡迎讀者給本公衆號打個星標,讓你天天學習新知識,探索人工智能的奧妙。




往期回顧

【Python3+OpenCV】實現圖像處理—基本操做篇

【玩轉華爲雲】教你用ModelArts實現數據集的圖像標註

【玩轉華爲雲】手把手教你ModelArts實現目標物體檢測

【玩轉華爲雲】基於ModelArts實現行人車輛檢測

【玩轉騰訊雲】人臉融合,看你將來孩子長什麼樣

【玩轉騰訊雲】使用API快速構建文字識別小工具

架構師之路:星環大數據架構師的培訓心得


武漢加油,中國加油!

歡迎各位讀者在下方進行提問留言



☆ END ☆

你與世界

只差一個

公衆號


掃描上方二維碼,便可獲取「編程學習資料」大禮包一份

本文分享自微信公衆號 - 看那個碼農(gh_31e9c1ac7ce4)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索