91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

opencv與numpy圖像的基本操作方法是什么

發布時間:2022-03-30 17:15:02 來源:億速云 閱讀:223 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“opencv與numpy圖像的基本操作方法是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“opencv與numpy圖像的基本操作方法是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

1. 像素基本操作

1.1 讀取、修改像素

可以通過[行,列]坐標來訪問像素點數據,對于多通道數據,返回一個數組,包含所有通道的值,對于單通道數據(如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 讀取圖像屬性

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

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

讀取像素大小, 行  通道數

>>> print( img.size )
562248

像素數據類型

>>> print( img.dtype )
uint8

1.3 圖像ROI操作

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

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)

opencv與numpy圖像的基本操作方法是什么

1.4 分割、合并通道

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

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

或者

b = img[:,:,0]

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

1.4 生成圖像邊框

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

void cv::copyMakeBorder ( 
InputArray src, //原圖
//目標圖(cpp版本中,若傳入此數據且選BORDER_TRANSPARENT,則此數據被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的效果,同時也能發現,python版的api與cpp版本的相比,默認初始化了一塊原始圖尺寸+各方向邊框尺寸的圖像內存,作為內置的dst參數。

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

2. 圖像的基本算術操作

2.1 圖像相加

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

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

>>> 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等參數

void cv::add ( 
InputArray src1,
InputArray src2,
OutputArray dst,
InputArray mask = noArray(),
int dtype = -1 
)

2.2 圖像混合

opencv通過 cv::addWeighted 函數提供了將兩個圖像混合在一起的方法

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函數還能做更精細的圖像局部融合。

讀到這里,這篇“opencv與numpy圖像的基本操作方法是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泌阳县| 青河县| 雷山县| 新沂市| 天全县| 石嘴山市| 山阴县| 福贡县| 县级市| 桃江县| 宝应县| 苗栗县| 亚东县| 原阳县| 高平市| 宁都县| 西乌| 克东县| 平塘县| 广灵县| 南澳县| 大同市| 将乐县| 成都市| 甘洛县| 元氏县| 绥芬河市| 湘阴县| 红安县| 汤阴县| 安庆市| 辉南县| 阿拉善左旗| 延寿县| 玛多县| 策勒县| 重庆市| 宁乡县| 昔阳县| 五家渠市| 蕲春县|