獲取圖像的像素值并修改
首先讀入一副圖像:
import numpy as np
import cv2
# 1.獲取并修改像素值
# 讀取一副圖像, 根據(jù)像素的行和列的坐標(biāo)獲取它的像素值, 對(duì)于RGB圖像而言, 返回RGB的值, 對(duì)于灰度圖則返回灰度值
img = cv2.imread('./resource/image/1.jpg', cv2.IMREAD_COLOR)
px = img[200, 100]
print(px) # [24 18 11]
blue = img[200, 100, 0]
print(blue) # 24
# 修改101行,101列的像素值
img[101, 101] = [255,255,255]
print(img[101,101])
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
獲取像素值及修改的更好方法:
import numpy as np
import cv2
# numpy是經(jīng)過(guò)優(yōu)化了的進(jìn)行快速矩陣運(yùn)算的包, 所以不推薦逐個(gè)獲取像素值并修改能矩陣運(yùn)算就不要用循環(huán)。
# 例如前5行的后3列, 用numpy的array.item()和array.itemset()會(huì)更好。 但是返回是標(biāo)量, 如果想獲得所有RGB
# 的值, 需要使用array.item()分割他們。
img = cv2.imread('./resource/image/1.jpg')
print(img.item(10, 10, 2))
img.itemset((10, 10, 2), 100)
print(img.item(10, 10, 2))
獲取圖像的屬性信息
img = cv2.imread(‘./resource/image/1.jpg’, cv2.IMREAD_COLOR)
img.shape: 圖像的形狀(包括行數(shù),列數(shù),通道數(shù)的元組)
img.size : 圖像的像素?cái)?shù)目
img.dtype :圖像的數(shù)據(jù)類(lèi)型
import numpy as np
import cv2
# 圖像屬性包括: 行, 列, 通道, 圖像數(shù)據(jù)類(lèi)型, 像素?cái)?shù)目等
# 如果圖像是灰度圖, 返回值僅有行數(shù)和列數(shù), 所以通過(guò)檢查返回值可以判斷是灰度圖還是彩色圖
img = cv2.imread('./resource/image/1.jpg', cv2.IMREAD_COLOR)
print(img.shape) # 彩色圖(1080, 1920, 3)
img = cv2.imread('./resource/image/1.jpg', cv2.IMREAD_GRAYSCALE)
print(img.shape) # 灰度圖(1080, 1920)
# img.size 獲取圖像像素?cái)?shù)
img = cv2.imread('./resource/image/1.jpg', cv2.IMREAD_COLOR)
print(img.size) # 6220800
print(img.dtype)# uint8
img = cv2.imread('./resource/image/1.jpg', cv2.IMREAD_GRAYSCALE)
print(img.size) # 2073600
print(img.dtype)# uint8
圖像的ROI區(qū)域
ROI(regionofinterest),感興趣區(qū)域。機(jī)器視覺(jué)、圖像處理中,從被處理的圖像以方框、圓、橢圓、不規(guī)則多邊形等方式勾勒出需要處理的區(qū)域,稱(chēng)為感興趣區(qū)域,ROI。在Halcon、OpenCV、Matlab等機(jī)器視覺(jué)軟件上常用到各種算子(Operator)和函數(shù)來(lái)求得感興趣區(qū)域ROI,并進(jìn)行圖像的下一步處理。
import cv2
import numpy as np
img = cv2.imread('./resource/opencv/image/messi5.jpg', cv2.IMREAD_COLOR)
ball = img[280:340, 330:390]
img2 = img.copy()
img2[273:333, 100:160] = ball
cv2.imshow('img', img)
cv2.imshow('roi', ball)
cv2.imshow('img2', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
圖像通道的拆分及合并
有時(shí)需要對(duì) BGR 三個(gè)通道分別進(jìn)行操作。這時(shí)就需要把 BGR 拆
分成單個(gè)通道。有時(shí)需要把獨(dú)立通道的圖片合并成一個(gè) BGR 圖像。
注:cv2.split()是比較耗時(shí)的操作,盡量使用numpy索引操作。
import numpy as np
import cv2
img = cv2.imread('./resource/image/1.jpg', cv2.IMREAD_COLOR)
# split函數(shù),拆分圖像數(shù)據(jù)
(b,g,r) = cv2.split(img)
img2 = cv2.merge([b,g,r]) # 合并數(shù)據(jù)
print(r.shape)
print(g.shape)
print(b.shape)
# Numpy索引拆分圖像數(shù)據(jù)
img = cv2.imread('./resource/image/1.jpg', cv2.IMREAD_COLOR)
b = img[:,:,0] # 拆分b通道
g = img[:,:,1] # 拆分g通道
r = img[:,:,2] # 拆分r通道
# 通道像素賦值
img[:,:,2]= 0 #
print(r.shape)
print(g.shape)
print(b.shape)
img3 = cv2.merge([b,g,r])
cv2.imshow('img', img)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
圖像擴(kuò)邊填充
如果想在圖像周?chē)鷦?chuàng)建一個(gè)邊,就像相框一樣,你可以使用cv2.copyMakeBorder()函數(shù)。這經(jīng)常在卷積運(yùn)算或 0 填充時(shí)被用到。這個(gè)函數(shù)包括如下參數(shù):
-
src 輸入圖像
-
top, bottom, left, right 對(duì)應(yīng)邊界的像素?cái)?shù)目。
-
borderType 要添加那種類(lèi)型的邊界,類(lèi)型如下:
- 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 不知道怎么說(shuō)了, 就像這樣: cdefgh|
abcdefgh|abcdefg
- cv2.BORDER_CONSTANT 添加有顏色的常數(shù)值邊界,還需要
-
value 邊界顏色,如果邊界的類(lèi)型是 cv2.BORDER_CONSTANT
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 邊界填充
img = cv2.imread('./resource/image/opencv-logo2.png')
# BORDER_REPLICATE:復(fù)制法,復(fù)制最邊緣的像素
# BORDER_REFLECT:反射法,
# BORDER_REFLECT101:反射法
# BORDER_WRAP:外包裝
# BORDER_CONSTANT:常量法
blue = [255, 0, 0]
replicate = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, 10, 10, 10,10, cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_REFLECT101)
wrap = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=blue)
plt.subplot(231), plt.imshow(img, 'gray'), plt.title('original'), plt.xticks([]),plt.yticks([])
plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('replicate'), plt.xticks([]),plt.yticks([])
plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('reflect'), plt.xticks([]),plt.yticks([])
plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('reflect101'), plt.xticks([]),plt.yticks([])
plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('warp'), plt.xticks([]),plt.yticks([])
plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('constant'), plt.xticks([]),plt.yticks([])
plt.show()
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('./resource/opencv/image/logo/opencv-logo-white.png', cv2.IMREAD_COLOR)
blue = [255, 0, 0]
replicate = cv2.copyMakeBorder(img, 20, 20, 20, 20, cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, 20, 20, 20, 20, cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, 20, 20, 20, 20, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, 20, 20, 20, 20, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, 20, 20, 20, 20, cv2.BORDER_CONSTANT, value=blue)
plt.subplot(231), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGBA)), plt.title('origin'), plt.xticks([]), plt.yticks([])
plt.subplot(232), plt.imshow(cv2.cvtColor(replicate, cv2.COLOR_BGR2RGBA)), plt.title('replicate'), plt.xticks([]), plt.yticks([])
plt.subplot(233), plt.imshow(cv2.cvtColor(reflect, cv2.COLOR_BGR2RGBA)), plt.title('reflect'), plt.xticks([]), plt.yticks([])
plt.subplot(234), plt.imshow(cv2.cvtColor(reflect101, cv2.COLOR_BGR2RGBA)), plt.title('reflect101'), plt.xticks([]), plt.yticks([])
plt.subplot(235), plt.imshow(cv2.cvtColor(wrap, cv2.COLOR_BGR2RGBA)), plt.title('wrap'), plt.xticks([]), plt.yticks([])
plt.subplot(236), plt.imshow(cv2.cvtColor(constant, cv2.COLOR_BGR2RGBA)), plt.title('constant'), plt.xticks([]), plt.yticks([])
plt.show()
圖像的算術(shù)運(yùn)算
圖像上的算術(shù)運(yùn)算有:加法,減法,乘法,除法,位運(yùn)算等
涉及的函數(shù)有:cv2.add(), cv2().addWeighted()等
- cv2.add():加
- cv2.subtract():減
- cv2.multiply():乘
- cv2.divide():除
圖像的加法
可以使用函數(shù) cv2.add() 將兩幅圖像進(jìn)行加法運(yùn)算,當(dāng)然也可以直接使
用 numpy, res=img1+img2。兩幅圖像的大小,類(lèi)型必須一致,或者第二個(gè)
圖像可以是一個(gè)簡(jiǎn)單的標(biāo)量值。
注意: OpenCV 中的加法與 Numpy 的加法是有所不同的。 OpenCV 的加法
是一種飽和操作,而 Numpy 的加法是一種模操作。如下例子所示:
x = np.uint8([250])
y = np.uint8([10])
print(cv2.add(x, y)) # 250 + 10 = 260 > 255, uint8 最大值255
# 輸出結(jié)果[[255]]
print(x + y) # 250_10=260%255=4
# 輸出結(jié)果[[4]]
圖像的混合
其實(shí)也是加法運(yùn)算,但不同的是兩幅圖像的權(quán)重不同,給人一種混合或透明的感覺(jué)。圖像混合計(jì)算公式如下:
g
(
x
)
=
(
1
?
α
)
f
0
(
x
)
+
α
f
1
(
x
)
g(x) = (1-\alpha)f_0(x) + \alpha f_1(x)
g(x)=(1?α)f0?(x)+αf1?(x)
通過(guò)修改
α
\alpha
α的值(0-1),可以實(shí)現(xiàn)不同權(quán)重的混合。
d
s
t
=
α
?
i
m
g
1
+
β
?
i
m
g
2
+
γ
dst = \alpha*img1 + \beta*img2+\gamma
dst=α?img1+β?img2+γ
這里
γ
\gamma
γ的值為0。
dst2 = cv2.addWeighted(img1, 0.3, img2, 0.7, 0)
import numpy as np
import cv2
from matplotlib import pyplot as plt
img1 = cv2.imread('./resource/image/1.jpg', cv2.IMREAD_COLOR)
img2 = cv2.imread('./resource/image/2.jpg', cv2.IMREAD_COLOR)
dst1 = img1 + img2
dst2 = cv2.addWeighted(img1, 0.3, img2, 0.7, 0)
plt.subplot(231), plt.imshow(img1), plt.title('img1')
plt.subplot(232), plt.imshow(img2), plt.title('img2')
plt.subplot(233), plt.imshow(dst1), plt.title('img1+img2')
plt.subplot(234), plt.imshow(dst2), plt.title('addWeighted(img1+img2)')
plt.show()
import cv2
import numpy as np
from matplotlib import pyplot as plt
img1 = cv2.imread('./resource/opencv/image/MachineLearnings.jpg', cv2.IMREAD_COLOR)
img2 = cv2.imread('./resource/opencv/image/100.png', cv2.IMREAD_COLOR)
print(img1.shape)
print(img2.shape)
img3 = img1 + img2
img4 = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)
imgs = np.hstack((img1, img2, img3, img4))
cv2.imshow('imgs', imgs)
cv2.waitKey(0)
cv2.destroyAllWindows()
圖像的位運(yùn)算
圖像的按位操作有: AND, OR, NOT, XOR 等。當(dāng)我們提取圖像的一部分,選擇非矩形 ROI 時(shí)這些操作會(huì)很有用。下面的例子就是教給我們?nèi)绾胃淖円环鶊D的特定區(qū)域。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-680062.html
- cv2.bitwise_and() 與
- cv2.bitwise_or() 或
- cv2.bitwise_not() 非
- cv2.bitwise_xor() 異或
import numpy as np
import cv2
img1 = cv2.imread('./resource/image/1.jpg')
img2 = cv2.imread('./resource/image/opencv-logo.png')
# 放置logo在左上角
rows, cols, channels = img2.shape
roi = img1[0:rows,0:cols]
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 175, 255, cv2.THRESH_BINARY) # 二值化處理
mask_inv = cv2.bitwise_not(mask)
img1_bg = cv2.bitwise_and(roi, roi, mask=mask)
img2_fg = cv2.bitwise_and(img2, img2, mask=mask_inv)
dst = cv2.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
cv2.imshow('logo', img2)
cv2.imshow('gray', img2gray)
cv2.imshow('mask', mask)
cv2.imshow('mask_inv', mask_inv)
cv2.imshow('bg', img1_bg)
cv2.imshow('fg', img2_fg)
cv2.imshow('res', img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-680062.html
到了這里,關(guān)于OpenCV-Python中的圖像基礎(chǔ)操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!