當前位置:首頁 > IT技術 > 編程語言 > 正文

打基礎丨Python圖像處理入門知識詳解
2022-04-19 11:14:41

摘要:本文講解圖像處理基礎知識和OpenCV入門函數(shù)。

本文分享自華為云社區(qū)《??[Python圖像處理] 一.圖像處理基礎知識及OpenCV入門函數(shù)??》,作者: eastmount。

一.圖像基礎知識

圖像都是由像素(pixel)構(gòu)成的,即圖像中的小方格,這些小方格都有一個明確的位置和被分配的色彩數(shù)值,而這些一小方格的顏色和位置就決定該圖像所呈現(xiàn)出來的樣子。像素是圖像中的最小單位,每一個點陣圖像包含了一定量的像素,這些像素決定圖像在屏幕上所呈現(xiàn)的大小。

打基礎丨Python圖像處理入門知識詳解_二值圖像

圖像通常包括二值圖像、灰度圖像和彩色圖像。

打基礎丨Python圖像處理入門知識詳解_灰度圖像_02

1.二值圖像

二值圖像中任何一個點非黑即白,要么為白色(像素為255),要么為黑色(像素為0)。將灰度圖像轉(zhuǎn)換為二值圖像的過程,常通過依次遍歷判斷實現(xiàn),如果像素>=127則設置為255,否則設置為0。

打基礎丨Python圖像處理入門知識詳解_彩色圖像_03

2.灰度圖像

灰度圖像除了黑和白,還有灰色,它把灰度劃分為256個不同的顏色,圖像看著也更為清晰。將彩色圖像轉(zhuǎn)換為灰度圖是圖像處理的最基本預處理操作,通常包括下面幾種方法:

(1) 浮點算法:Gray=R0.3+G0.59+B0.11

(2) 整數(shù)方法:Gray=(R30+G59+B11)/100

(3) 移位方法:Gray=(R28+G151+B77)>>8;

(4) 平均值法:Gray=(R+G+B)/3;(此程序采用算法)

(5) 僅取綠色:Gray=G;

(6) 加權平均值算法:根據(jù)光的亮度特性,公式: R=G=B=R0.299+G*0.587+B0.144

通過上述任一種方法求得Gray后,將原來的RGB(R,G,B)中的R,G,B統(tǒng)一用Gray替換,形成新的顏色RGB(Gray,Gray,Gray),用它替換原來的RGB(R,G,B)就是灰度圖了。改變象素矩陣的RGB值,來達到彩色圖轉(zhuǎn)變?yōu)榛叶葓D。

打基礎丨Python圖像處理入門知識詳解_灰度圖像_04

3.彩色圖像

彩色圖像是RGB圖像,RGB表示紅、綠、藍三原色,計算機里所有顏色都是三原色不同比例組成的,即三色通道。

打基礎丨Python圖像處理入門知識詳解_圖像處理_05

二.OpenCV讀寫圖像

本文主要使用Python2.7和OpenCV進行講解,首先調(diào)用"pip install opencv-python"安裝OpenCV庫,如下圖所示:

打基礎丨Python圖像處理入門知識詳解_彩色圖像_06

1.讀入圖像

OpenCV讀圖像主要調(diào)用下面函數(shù)實現(xiàn):

img = cv2.imread(文件名,[,參數(shù)])
參數(shù)(1) cv2.IMREAD_UNCHANGED (圖像不可變)
參數(shù)(2) cv2.IMREAD_GRAYSCALE (灰度圖像)
參數(shù)(3) cv2.IMREAD_COLOR (讀入彩色圖像)
參數(shù)(4) cv2.COLOR_BGR2RGB (圖像通道BGR轉(zhuǎn)成RGB)

2.顯示圖像

顯示圖像調(diào)用函數(shù)如下:

cv2.imshow(窗口名, 圖像名)

3.窗口等待

調(diào)用函數(shù)如下:

cv2.waitKey(delay)
鍵盤綁定函數(shù),共一個參數(shù),表示等待毫秒數(shù),將等待特定的幾毫秒,看鍵盤是否有輸入,返回值為ASCII值。如果其參數(shù)為0,則表示無限期的等待鍵盤輸入;參數(shù)>0表示等待delay毫秒;參數(shù)<0表示等待鍵盤單擊。

4.刪除所有窗口

調(diào)用函數(shù)如下:

cv2.destroyAllWindows() 刪除所有窗口
cv2.destroyWindows() 刪除指定的窗口

5.寫入圖片

調(diào)用函數(shù)如下:

retval = cv2.imwrite(文件地址, 文件名)

下面代碼是讀入圖片并顯示保存。

# -*- coding:utf-8 -*-
import cv2

#讀取圖片
img = cv2.imread("test.jpg")

#顯示圖像
cv2.imshow("Demo", img)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

#寫入圖像
cv2.imwrite("testyxz.jpg", img)

輸出結(jié)果如下圖所示,并且在文件夾下保存了一張名為“testyxz.jpg”的圖像。

打基礎丨Python圖像處理入門知識詳解_圖像處理_07

如果代碼中沒有watiKey(0)函數(shù),則運行結(jié)果如下圖所示:

打基礎丨Python圖像處理入門知識詳解_灰度圖像_08

同時,可以對代碼進行升級,如下所示:

#無限期等待輸入
k=cv2.waitKey(0)
#如果輸入ESC退出
if k==27:
cv2.destroyAllWindows()

三.OpenCV像素處理

1.讀取像素

灰度圖像直接返回灰度值,彩色圖像則返回B、G、R三個分量。注意OpenCV讀取圖像是BGR存儲顯示,需要轉(zhuǎn)換為RGB再進行圖像處理。

灰度圖像:返回值 = 圖像(位置參數(shù))
eg: test=img[88,42]
彩色圖像:返回值 = 圖像[位置元素, 0 | 1 | 2 ] 獲取BGR三個通道像素
eg: blue=img[88,142,0] green=img[88,142,1] red=img[88,142,2]

2.修改圖像

修改圖像如果是灰度圖像則直接賦值新像素即可,彩色圖像依次給三個值賦值即可。

灰度圖像:
img[88,142] = 255
彩色圖像:
img[88,142, 0] = 255
img[88,142, 1] = 255
img[88,142, 2] = 255
彩色圖像:方法二
img[88,142] = [255, 255, 255]

下面代碼是獲取像素及修改的操作。

# -*- coding:utf-8 -*-
import cv2

#讀取圖片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
test = img[88,142]
print test
img[88,142] = [255, 255, 255]
print test

#分別獲取BGR通道像素
blue = img[88,142,0]
print blue
green = img[88,142,1]
print green
red = img[88,142,2]
print red

#顯示圖像
cv2.imshow("Demo", img)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

#寫入圖像
cv2.imwrite("testyxz.jpg", img)

輸出結(jié)果如下所示:

[158 107 64]

[255 255 255]

255

255

255

下面代碼是將行為100到200、列150到250的像素區(qū)域設置為白色。

# -*- coding:utf-8 -*-
import cv2

#讀取圖片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)

#該區(qū)域設置為白色
img[100:200, 150:250] = [255,255,255]

#顯示圖像
cv2.imshow("Demo", img)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

#寫入圖像
cv2.imwrite("testyxz.jpg", img)

運行結(jié)果如下圖所示:

打基礎丨Python圖像處理入門知識詳解_彩色圖像_09

希望文章對大家有所幫助,如果有錯誤或不足之處,還請海涵。再次感謝您的關注,初來在華為云社區(qū)分享知識,初來乍到,還請多多指教。

本文摘錄自eastmount X華為云開發(fā)者社區(qū)聯(lián)合出品的電子書《從零到一 ? Python圖像處理及識別》。

??點擊免費下載電子書《從零到一 ? Python圖像處理及識別》??


??點擊關注,第一時間了解華為云新鮮技術~??

本文摘自 :https://blog.51cto.com/u

開通會員,享受整站包年服務立即開通 >