1.獲取并修改像素值
首先我們需要讀入一幅圖像,可以根據(jù)像素的行和列的坐標(biāo)獲取他的像素值。對(duì) BGR 圖像而言,返回值為 B,G,R 的值。對(duì)灰度圖像而言,會(huì)返回他的灰度值(亮度 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)
# 打印結(jié)果
## [57 63 68]
## 57
# 修改像素值
img[100,100]=[255,255,255]
print(img[100,100])
## [255 255 255]
Numpy 是經(jīng)過優(yōu)化了的進(jìn)行快速矩陣運(yùn)算的軟件包。所以我們不推薦逐個(gè)獲取像素值并修改,這樣會(huì)很慢,能用矩陣運(yùn)算就不要用循環(huán)。對(duì)于獲取每一個(gè)像素值,也許使用 Numpy 的 array.item() 和 array.itemset() 會(huì)更好。但是返回值是標(biāo)量。如果你想獲得所有 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.獲取圖像屬性
圖像的屬性包括:行,列,通道,圖像數(shù)據(jù)類型,像素?cái)?shù)目等.
img.shape
可以獲取圖像的形狀,他的返回值是一個(gè)包含行數(shù),列數(shù),通道數(shù)的元組。如果圖像是灰度圖,返回值僅有行數(shù)和列數(shù)。所以
通過檢查這個(gè)返回值就可以知道加載的是灰度圖還是彩色圖
。
img.size
可以返回圖像的像素?cái)?shù)目。
img.dtype
返回的是圖像的數(shù)據(jù)類型。
?
注意:在debug時(shí) img.dtype 非常重要。因?yàn)樵?OpenCVPython 代碼中經(jīng)常出現(xiàn)數(shù)據(jù)類型的不一致。
3.圖像ROI
有時(shí)你需要對(duì)一幅圖像的特定區(qū)域進(jìn)行操作。例如我們要檢測(cè)一副圖像中眼睛的位置,我們首先應(yīng)該在圖像中找到臉,再在臉的區(qū)域中找眼睛,而不是直接在一幅圖像中搜索。這樣會(huì)提高程序的準(zhǔn)確性和性能。
ROI 也是使用 Numpy 索引來獲得的。現(xiàn)在我們選擇球的部分并把他拷貝到圖像的其他區(qū)域。
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
結(jié)果如下:
?
4.拆分及合并圖像通道
有時(shí)我們需要對(duì) BGR 三個(gè)通道分別進(jìn)行操作。這是你就需要把 BGR 拆分成單個(gè)通道。有時(shí)你需要把獨(dú)立通道的圖片合并成一個(gè) 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] # 單獨(dú)拆出藍(lán)色通道
img[:, :, 2] = 0 # 將紅色通道值全部賦值為0
?注意:cv2.split() 是一個(gè)比較耗時(shí)的操作。只有真正需要時(shí)才用它,能用Numpy 索引就盡量用。
?
5.為圖像擴(kuò)邊(填充)
圖像擴(kuò)邊(填充),在卷積運(yùn)算或 0 填充時(shí)經(jīng)常被用到。如果你想在圖像周圍創(chuàng)建一個(gè)邊,就像相框一樣,你可以使用
cv2.copyMakeBorder()函數(shù)
。這個(gè)函數(shù)包括如下參數(shù):
? src 輸入圖像
? top, bottom, left, right 對(duì)應(yīng)邊界的像素?cái)?shù)目。
? borderType 要添加哪種類型的邊界,類型如下:
? ? ? ? – cv2.BORDER_CONSTANT 添加有顏色的常數(shù)值邊界,還需要下一個(gè)參數(shù)(value)。
? ? ? ? – cv2.BORDER_REFLECT 邊界元素的鏡像。比如: fedcba|abcdefgh|hgfedcb
? ? ? ? – cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT跟上面一樣,但稍作改動(dòng)。例如: gfedcb|abcdefgh|gfedcba
? ? ? ? – cv2.BORDER_REPLICATE 重復(fù)最后一個(gè)元素。例如: aaaaaa|abcdefgh|hhhhhhh
? ? ? ? – cv2.BORDER_WRAP 不知道怎么說了, 就像這樣: cdefgh|abcdefgh|abcdefg
? value 邊界顏色,如果邊界的類型是 cv2.BORDER_CONSTANT,需要value參數(shù)
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()
結(jié)果如下(由于OpenCV 中是按 BGR,matplotlib 中是按 RGB 排列,本例是使用 matplotlib 繪制,所以顯示的圖像和實(shí)際相比較交換了 R 和 B 的位置):
?實(shí)際的圖標(biāo)是下面這樣的:
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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