国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

opencv與numpy的圖像基本操作

2020-01-04 13:35:51
字體:
供稿:網(wǎng)友

1. 像素基本操作

1.1 讀取、修改像素

可以通過[行,列]坐標來訪問像素點數(shù)據(jù),對于多通道數(shù)據(jù),返回一個數(shù)組,包含所有通道的值,對于單通道數(shù)據(jù)(如gray),返回指定坐標的值,也可以通過 [行,列,通道index] 來訪問某坐標某通道的值。

>>> 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

可以直接通過坐標修改像素值

>>> img[100,100] = [255,255,255]>>> print( img[100,100] )[255 255 255]

然而直接像上面這樣去讀取、修改每個像素的值,效率是比較低的,可以使用下面的方法,效率是更高的

# 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 讀取圖像屬性

讀取圖像尺寸,返回一個元組 (行,列,通道數(shù))

>>> print( img.shape )(342, 548, 3)

讀取像素大小, 行  通道數(shù)

>>> print( img.size )562248

像素數(shù)據(jù)類型

>>> print( img.dtype )uint8

1.3 圖像ROI操作

可以直接編輯像素區(qū)域,例如把圖像左下角50*50的像素復制到左上角

import cv2import numpy as npimg = cv2.imread("test.jpg")print(img.shape)roiTest = img[475:525, 0:50]img[0:50, 0:50] = roiTestcv2.imshow("image",img)cv2.waitKey(0)

opencv,numpy,圖像

1.4 分割、合并通道

有些情況下需要對圖像的某一通道數(shù)據(jù)進行操作,此時會用到分割、合并通道數(shù)據(jù)

>>> b,g,r = cv2.split(img)>>> img = cv2.merge((b,g,r))

或者

b = img[:,:,0]

假設想編輯紅色通道的數(shù)據(jù),全部設置為0,不需要這樣分割后編輯, img[:,:,2] = 0 這樣即可。cv2.split操作是一個很耗時的操作,可以用numpy索引替代的操作,盡量用numpy索引來做。

1.4 生成圖像邊框

使用 cv2.copyMakeBorder 函數(shù)可添加圖像邊框,支持多種邊框算法

void cv::copyMakeBorder ( InputArray src, //原圖//目標圖(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 四個方向上的邊框像素int bottom,int left,int right,int borderType, //邊框類型見下圖const Scalar & value = Scalar() //邊框類型為BORDER_CONSTANT時的邊框像素) 

opencv,numpy,圖像

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()

opencv,numpy,圖像

上面的例子可以比較直觀的看到各種border的效果,同時也能發(fā)現(xiàn),python版的api與cpp版本的相比,默認初始化了一塊原始圖尺寸+各方向邊框尺寸的圖像內(nèi)存,作為內(nèi)置的dst參數(shù)。

輸出尺寸:(525, 700, 3) (725, 900, 3)

2. 圖像的基本算術(shù)操作

2.1 圖像相加

圖像相加,兩個圖像應該有相同的shape,或者圖像和一個標量相加,或者圖像和一個與其通道數(shù)相同的一維數(shù)組相加。

opencv的相加與numpy相加時,在超出數(shù)據(jù)類型范圍時的處理不同

>>> 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ù)提供了將兩個圖像混合在一起的方法

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()

opencv,numpy,圖像

通過cv2.seamlessClone函數(shù)還能做更精細的圖像局部融合。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到python教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 萍乡市| 柳江县| 新民市| 化隆| 乌拉特前旗| 永康市| 威海市| 长岛县| 宜兴市| 营山县| 广昌县| 融水| 东兰县| 顺平县| 杭州市| 锦州市| 龙川县| 凤庆县| 米脂县| 萨嘎县| 三台县| 绵阳市| 天长市| 辽源市| 潜山县| 磐石市| 云龙县| 松潘县| 富裕县| 阿拉善右旗| 根河市| 宜都市| 体育| 荣昌县| 枣强县| 博罗县| 东安县| 扶绥县| 姜堰市| 怀柔区| 宁明县|