1. 程式人生 > 其它 >Python影象處理丨OpenCV+Numpy庫讀取與修改畫素

Python影象處理丨OpenCV+Numpy庫讀取與修改畫素

摘要:本篇文章主要講解 OpenCV+Numpy 影象處理基礎知識,包括讀取畫素和修改畫素。

本文分享自華為雲社群《[Python影象處理] 二.OpenCV+Numpy庫讀取與修改畫素》,作者: eastmount。

一.傳統讀取畫素方法

1.灰度影象,返回灰度值。

返回值=影象(位置引數),例:p = img[88,142] print§

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

#讀取圖片
img = cv2.imread("picture.bmp", cv2.IMREAD_UNCHANGED)

#灰度影象
p = img[88, 142]
print(p)

#顯示影象
cv2.imshow(
"Demo", img) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows() #寫入影象 cv2.imwrite("testyxz.jpg", img)

輸出結果如下圖所示:[131 131 131],由於該圖是24位BMP,B=G=R輸出三個相同的結果,有的影象僅有一個畫素點則輸出一個值。

2.BGR影象,返回值為B、G、R的值。

例:

b = img[78, 125, 0] print(b)
g = img[78, 125, 1] print(g)
r = img[78,125, 2] print®

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

#讀取圖片
img 
= cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #BGR影象 b = img[78, 125, 0] print(b) g = img[78, 125, 1] print(g) r = img[78, 125, 2] print(r) #方法二 bgr = img[78, 125] print(bgr) #顯示影象 cv2.imshow("Demo", img) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows() #寫入影象 cv2.imwrite("testyxz.jpg", img)

輸出畫素和影象如下所示:

155
104
61
[155 104 61]

二.傳統修改畫素方法

1.修改單個畫素值

BGR影象可以通過位置引數直接訪問畫素值並進行修改,輸出結果如下所示:

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

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

#BGR影象
print(img[78, 125, 0])
print(img[78, 125, 1])
print(img[78, 125, 2])

#修改畫素
img[78, 125, 0] = 255
img[78, 125, 1] = 255
img[78, 125, 2] =255

print(img[78, 125])
img[78, 125] = [10, 10, 10]
print(img[78, 125, 0])
print(img[78, 125, 1])
print(img[78, 125, 2])
#方法二
print(img[78, 125])
img[78, 125] = [10, 10, 10]
print(img[78, 125])

輸出結果如下所示,通過兩種方法分別將B、G、R畫素值修改為255和0。

155
104
61
255
255
255
[255 255 255]
[10 10 10]

2.修改區域畫素

通過訪問影象陣列的位置區域實現區域畫素修改,比如 [100:150,400:500] 是訪問第100到150行,400到500列的區域,再對該區域畫素進行修改。程式碼如下所示:

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

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

#BGR影象
img[100:150, 400:500] = [255, 255, 0]

#顯示影象
cv2.imshow("Demo", img)

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

#寫入影象
cv2.imwrite("testyxz.jpg", img)

輸出結果如下圖所示,[255, 255, 0]是淺藍色。

三.Numpy讀取畫素方法

使用Numpy進行畫素讀取,呼叫方式如下:

返回值 = 影象.item(位置引數)

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

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

#Numpy讀取畫素
blue = img.item(78, 100, 0)
green = img.item(78, 100, 1)
red = img.item(78, 100, 2)
print(blue)
print(green)
print(red)

#顯示影象
cv2.imshow("Demo", img)

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

輸出結果如下,注意OpenCV讀取影象通道是BGR,也可以轉換成RGB在進行處理。

155
104
61

四.Numpy修改畫素方法

使用Numpy的itemset函式修改畫素,呼叫方式如下:

影象.itemset(位置, 新值)

例如:img.itemset((88,99), 255)

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

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

#Numpy讀取畫素
print(img.item(78, 100, 0))
print(img.item(78, 100, 1))
print(img.item(78, 100, 2))
img.itemset((78, 100, 0), 100)
img.itemset((78, 100, 1), 100)
img.itemset((78, 100, 2), 100)
print(img.item(78, 100, 0))
print(img.item(78, 100, 1))
print(img.item(78, 100, 2))

輸出結果如下:

155
104
61
100
100
100

也可以同時輸出B、G、R三個值,核心程式碼如下:

print(img[78, 78])
img.itemset((78, 78, 0), 0)
img.itemset((78, 78, 1), 0)
img.itemset((78, 78, 2), 0)
print(img[78, 78])
#[155 104  61]
#[0 0 0]

本文摘錄自eastmount X華為雲開發者社群聯合出品的電子書《從零到一 • Python影象處理及識別》。

點選免費下載電子書《從零到一 • Python影象處理及識別》

 

點選關注,第一時間瞭解華為雲新鮮技術~