[Python影象處理] 二.OpenCV+Numpy庫讀取與修改畫素

Eastmount發表於2018-08-28

該系列文章是講解Python OpenCV影象處理知識,前期主要講解影象入門、OpenCV基礎用法,中期講解影象處理的各種演算法,包括影象銳化運算元、影象增強技術、影象分割等,後期結合深度學習研究影象識別、影象分類應用。希望文章對您有所幫助,如果有不足之處,還請海涵~

同時推薦作者的C++影象系列知識:
[數字影象處理] 一.MFC詳解顯示BMP格式圖片
[數字影象處理] 二.MFC單文件分割視窗顯示圖片
[數字影象處理] 三.MFC實現影象灰度、取樣和量化功能詳解
[數字影象處理] 四.MFC對話方塊繪製灰度直方圖
[數字影象處理] 五.MFC影象點運算之灰度線性變化、灰度非線性變化、閾值化和均衡化處理詳解
[數字影象處理] 六.MFC空間幾何變換之影象平移、映象、旋轉、縮放詳解
[數字影象處理] 七.MFC影象增強之影象普通平滑、高斯平滑、Laplacian、Sobel、Prewitt銳化詳解

前文參考:
[Python影象處理] 一.影象處理基礎知識及OpenCV入門函式

本篇文章主要講解 OpenCV+Numpy 影象處理基礎知識,包括讀取畫素和修改畫素。知識點如下:
1.傳統讀取畫素方法
2.傳統修改畫素方法
3.Numpy讀取畫素方法
4.Numpy修改畫素方法

PS: 文章也學習了網易雲高登教育的知識,推薦大家學習。

PSS:2019年1~2月作者參加了CSDN2018年部落格評選,希望您能投出寶貴的一票。我是59號,Eastmount,楊秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index

[Python影象處理] 二.OpenCV+Numpy庫讀取與修改畫素
五年來寫了314篇部落格,12個專欄,是真的熱愛分享,熱愛CSDN這個平臺,也想幫助更多的人,專欄包括Python、資料探勘、網路爬蟲、影象處理、C#、Android等。現在也當了兩年老師,更是覺得有義務教好每一個學生,讓貴州學子好好寫點程式碼,學點技術,"師者,傳到授業解惑也",提前祝大家新年快樂。2019我們攜手共進,為愛而生。

一.傳統讀取畫素方法

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輸出三個相同的結果,有的影象僅有一個畫素點則輸出一個值。

[Python影象處理] 二.OpenCV+Numpy庫讀取與修改畫素

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]

[Python影象處理] 二.OpenCV+Numpy庫讀取與修改畫素


二.傳統修改畫素方法

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, 
print(img[78, 125])
img[78, 125] = [10, 10, 10]
print(img[78, 125])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]是淺藍色。

[Python影象處理] 二.OpenCV+Numpy庫讀取與修改畫素


三.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]


希望文章對大家有所幫助,如果有錯誤或不足之處,還請海涵。
(By:Eastmount 2018-08-28 早8點 https://blog.csdn.net/Eastmount/)

相關文章