1.獲取并修改像素值
首先我們需要讀入一幅圖像,可以根據像素的行和列的坐標獲取他的像素值。對 BGR 圖像而言,返回值為 B,G,R 的值。對灰度圖像而言,會返回他的灰度值(亮度 intensity):
import cv2
import numpy as np
img = cv2.imread('D:/opencv/images/roi.jpg')
# 獲取像素值
px = img[100,100]
print(px)
blue = img[100,100,0]
print(blue)
# 打印結果
## [57 63 68]
## 57
# 修改像素值
img[100,100]=[255,255,255]
print(img[100,100])
## [255 255 255]
Numpy 是經過優化了的進行快速矩陣運算的軟件包。所以我們不推薦逐個獲取像素值并修改,這樣會很慢,能用矩陣運算就不要用循環。對于獲取每一個像素值,也許使用 Numpy 的 array.item() 和 array.itemset() 會更好。但是返回值是標量。如果你想獲得所有 B, G, R 的值,你需要使用 array.item() 分割他們。獲取像素值及修改的更好方法:
import cv2
import numpy as np
img = cv2.imread('D:/opencv/images/roi.jpg')
print img.item(10,10,2)
img.itemset((10,10,2),100)
print(img.item(10,10,2))
## 50
## 100
2.獲取圖像屬性
圖像的屬性包括:行,列,通道,圖像數據類型,像素數目等.
img.shape
可以獲取圖像的形狀,他的返回值是一個包含行數,列數,通道數的元組。如果圖像是灰度圖,返回值僅有行數和列數。所以
通過檢查這個返回值就可以知道加載的是灰度圖還是彩色圖
。
img.size
可以返回圖像的像素數目。
img.dtype
返回的是圖像的數據類型。
?
注意:在debug時 img.dtype 非常重要。因為在 OpenCVPython 代碼中經常出現數據類型的不一致。
3.圖像ROI
有時你需要對一幅圖像的特定區域進行操作。例如我們要檢測一副圖像中眼睛的位置,我們首先應該在圖像中找到臉,再在臉的區域中找眼睛,而不是直接在一幅圖像中搜索。這樣會提高程序的準確性和性能。
ROI 也是使用 Numpy 索引來獲得的。現在我們選擇球的部分并把他拷貝到圖像的其他區域。
import cv2
import numpy as np
img=cv2.imread('D:/opencv/images/roi.jpg')
ball=img[280:340,330:390]
img[270:330,100:160]=bal
結果如下:
?
4.拆分及合并圖像通道
有時我們需要對 BGR 三個通道分別進行操作。這是你就需要把 BGR 拆分成單個通道。有時你需要把獨立通道的圖片合并成一個 BGR 圖像。可以這樣做:
拆通道:b, g, r = cv2.spilt(img)
合并通道:img = cv2.merge(b, g, r)
import cv2
import numpy as np
img=cv2.imread('D:/opencv/images/roi.jpg')
b,g,r=cv2.split(img) #拆通道
img=cv2.merge(b,g,r) #合并通道
b = img[:, :, 0] # 單獨拆出藍色通道
img[:, :, 2] = 0 # 將紅色通道值全部賦值為0
?注意:cv2.split() 是一個比較耗時的操作。只有真正需要時才用它,能用Numpy 索引就盡量用。
?
5.為圖像擴邊(填充)
圖像擴邊(填充),在卷積運算或 0 填充時經常被用到。如果你想在圖像周圍創建一個邊,就像相框一樣,你可以使用
cv2.copyMakeBorder()函數
。這個函數包括如下參數:
? src 輸入圖像
? top, bottom, left, right 對應邊界的像素數目。
? borderType 要添加哪種類型的邊界,類型如下:
? ? ? ? – cv2.BORDER_CONSTANT 添加有顏色的常數值邊界,還需要下一個參數(value)。
? ? ? ? – cv2.BORDER_REFLECT 邊界元素的鏡像。比如: fedcba|abcdefgh|hgfedcb
? ? ? ? – cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT跟上面一樣,但稍作改動。例如: gfedcb|abcdefgh|gfedcba
? ? ? ? – cv2.BORDER_REPLICATE 重復最后一個元素。例如: aaaaaa|abcdefgh|hhhhhhh
? ? ? ? – cv2.BORDER_WRAP 不知道怎么說了, 就像這樣: cdefgh|abcdefgh|abcdefg
? value 邊界顏色,如果邊界的類型是 cv2.BORDER_CONSTANT,需要value參數
import cv2
import numpy as np
from matplotlib import pyplot as plt
BLUE=[255,0,0]
img1=cv2.imread('opencv_logo.png')
replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)
plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
plt.show()
結果如下(由于OpenCV 中是按 BGR,matplotlib 中是按 RGB 排列,本例是使用 matplotlib 繪制,所以顯示的圖像和實際相比較交換了 R 和 B 的位置):
?實際的圖標是下面這樣的:
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
