opencv與numpy的圖像基本操作
1. 像素基本操作
1.1 讀取、修改像素
可以通過[行,列]坐標(biāo)來訪問像素點(diǎn)數(shù)據(jù),對于多通道數(shù)據(jù),返回一個(gè)數(shù)組,包含所有通道的值,對于單通道數(shù)據(jù)(如gray),返回指定坐標(biāo)的值,也可以通過 [行,列,通道index] 來訪問某坐標(biāo)某通道的值。
>>> import cv2 >>> import numpy as np >>> img = cv2.imread('messi5.jpg')
>>> px = img[100,100] >>> print( px ) [157 166 200] # accessing only blue pixel >>> blue = img[100,100,0] >>> print( blue ) 157
可以直接通過坐標(biāo)修改像素值
>>> img[100,100] = [255,255,255] >>> print( img[100,100] ) [255 255 255]
然而直接像上面這樣去讀取、修改每個(gè)像素的值,效率是比較低的,可以使用下面的方法,效率是更高的
# accessing RED value >>> img.item(10,10,2) 59 # modifying RED value >>> img.itemset((10,10,2),100) >>> img.item(10,10,2) 100
1.2 讀取圖像屬性
讀取圖像尺寸,返回一個(gè)元組 (行,列,通道數(shù))
>>> print( img.shape ) (342, 548, 3)
讀取像素大小, 行 列 通道數(shù)
>>> print( img.size ) 562248
像素?cái)?shù)據(jù)類型
>>> print( img.dtype ) uint8
1.3 圖像ROI操作
可以直接編輯像素區(qū)域,例如把圖像左下角50*50的像素復(fù)制到左上角
import cv2 import numpy as np img = cv2.imread("test.jpg") print(img.shape) roiTest = img[475:525, 0:50] img[0:50, 0:50] = roiTest cv2.imshow("image",img) cv2.waitKey(0)
1.4 分割、合并通道
有些情況下需要對圖像的某一通道數(shù)據(jù)進(jìn)行操作,此時(shí)會用到分割、合并通道數(shù)據(jù)
>>> b,g,r = cv2.split(img) >>> img = cv2.merge((b,g,r))
或者
b = img[:,:,0]
假設(shè)想編輯紅色通道的數(shù)據(jù),全部設(shè)置為0,不需要這樣分割后編輯, img[:,:,2] = 0
這樣即可。cv2.split操作是一個(gè)很耗時(shí)的操作,可以用numpy索引替代的操作,盡量用numpy索引來做。
1.4 生成圖像邊框
使用 cv2.copyMakeBorder
函數(shù)可添加圖像邊框,支持多種邊框算法
void cv::copyMakeBorder ( InputArray src, //原圖 //目標(biāo)圖(cpp版本中,若傳入此數(shù)據(jù)且選BORDER_TRANSPARENT,則此數(shù)據(jù)被top/bottom/left/right切出來的roi部分不會被做任何修改,此圖像大小=dst.rows+top+bottom,dst.cols+left+right) OutputArray dst, int top, //top/left/bottom/right 四個(gè)方向上的邊框像素 int bottom, int left, int right, int borderType, //邊框類型見下圖 const Scalar & value = Scalar() //邊框類型為BORDER_CONSTANT時(shí)的邊框像素 )
BLUE = [255, 0, 0] img1 = cv2.imread("test.jpg") replicate = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_REPLICATE) reflect = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_REFLECT) reflect101 = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_REFLECT_101) wrap = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_WRAP) constant = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_CONSTANT, value=BLUE) print(img1.shape, reflect.shape) 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()
上面的例子可以比較直觀的看到各種border的效果,同時(shí)也能發(fā)現(xiàn),python版的api與cpp版本的相比,默認(rèn)初始化了一塊原始圖尺寸+各方向邊框尺寸的圖像內(nèi)存,作為內(nèi)置的dst參數(shù)。
輸出尺寸:(525, 700, 3) (725, 900, 3)
2. 圖像的基本算術(shù)操作
2.1 圖像相加
圖像相加,兩個(gè)圖像應(yīng)該有相同的shape,或者圖像和一個(gè)標(biāo)量相加,或者圖像和一個(gè)與其通道數(shù)相同的一維數(shù)組相加。
opencv的相加與numpy相加時(shí),在超出數(shù)據(jù)類型范圍時(shí)的處理不同
>>> x = np.uint8([250]) >>> y = np.uint8([10]) >>> print( cv2.add(x,y) ) # 250+10 = 260 => 255 [[255]] >>> print( x+y ) # 250+10 = 260 % 256 = 4 [4]
cpp版本的api還支持mask等參數(shù)
void cv::add ( InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray(), int dtype = -1 )
2.2 圖像混合
opencv通過 cv::addWeighted
函數(shù)提供了將兩個(gè)圖像混合在一起的方法
dst=α⋅img1+β⋅img2+γ
img1 = cv2.imread('ml.png') img2 = cv2.imread('opencv-logo.png') dst = cv2.addWeighted(img1,0.7,img2,0.3,0) cv2.imshow('dst',dst) cv2.waitKey(0) cv2.destroyAllWindows()
通過cv2.seamlessClone函數(shù)還能做更精細(xì)的圖像局部融合。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- ubuntu下編譯安裝opencv的方法
- Opencv+Python實(shí)現(xiàn)圖像運(yùn)動(dòng)模糊和高斯模糊的示例
- OpenCV HSV顏色識別及HSV基本顏色分量范圍
- 基于OpenCV python3實(shí)現(xiàn)證件照換背景的方法
- Python基于opencv調(diào)用攝像頭獲取個(gè)人圖片的實(shí)現(xiàn)方法
- OpenCV+Python識別車牌和字符分割的實(shí)現(xiàn)
- python opencv判斷圖像是否為空的實(shí)例
- python用opencv批量截取圖像指定區(qū)域的方法
- Python+OpenCV圖片局部區(qū)域像素值處理詳解
- Opencv-Python圖像透視變換cv2.warpPerspective的示例
相關(guān)文章
python實(shí)現(xiàn)上傳文件到linux指定目錄的方法
這篇文章主要介紹了python實(shí)現(xiàn)上傳文件到linux指定目錄的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01Python+PyQt5實(shí)現(xiàn)網(wǎng)口功能測試詳解
這篇文章主要為大家詳細(xì)介紹了Python+PyQt5實(shí)現(xiàn)網(wǎng)口功能測試的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02基礎(chǔ)的十進(jìn)制按位運(yùn)算總結(jié)與在Python中的計(jì)算示例
按位運(yùn)算是計(jì)算機(jī)學(xué)習(xí)中的基礎(chǔ),Python完全支持位運(yùn)算符從而幾乎可以直接顯示出位運(yùn)算的結(jié)果,這里我們稍微總結(jié)一下基礎(chǔ)的十進(jìn)制按位運(yùn)算總結(jié)與在Python中的計(jì)算示例2016-06-06python代碼實(shí)現(xiàn)將列表中重復(fù)元素之間的內(nèi)容全部濾除
這篇文章主要介紹了python代碼實(shí)現(xiàn)將列表中重復(fù)元素之間的內(nèi)容全部濾除,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Python 調(diào)用有道翻譯接口實(shí)現(xiàn)翻譯
這篇文章主要介紹了Python 調(diào)用有道翻譯接口實(shí)現(xiàn)翻譯,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03