opencv python教程简书_OpenCV-Python系列二:常用的图像属性
對于圖像,我們經常需要知道關于圖像的特殊屬性,比如寬度,高度,面積,像素點數目等等,那么在opencv-python中,這些信息如何獲取呢?
本文結構:
1.基本圖像屬性
2. 對于opencv中的特殊數據類型
3. 圖像的矩
1. 圖像的基本屬性
圖像的寬度、高度
首先,opencv通過下面的方式獲取圖像內容
img = cv2.imread('bgrImage.jpg', -1)#-1-以圖像原格式,0-灰度格式,1-三通道格式, OpenCV使用的BGR三通道格式
opencv-python中使用cv2.imread()函數讀取圖像信息,數據類型為numpy.ndarray,不能通過img.cols, img.rows來獲取(C++版本cv::Mat的方式),通常會采用下面的方式獲取圖像的寬度,高度,通道數。
row, col, channel = img.shape #返回一個tuple(row, col, channel)
圖像的像素數目,數據類型
pixels = img.size
img_data_type = img.dtype#uint8等
對像素點的索引
px = img[10, 10]
print(px)# [ 84 188 155]
px = img[10, 10, 0]
print(px) # 84
我們可以通過上面的方式實現對圖像元素進行操作, 當你對處理速度有要求,可以使用img.item(row, col, channel)來獲取元素和使用img.itemset((row, col, channel), val)來修改元素。
2. 對于opencv中的特殊數據類型
這里主要參考著C++版本的OpenCV庫,比如cv::Point, cv::Rect, cv::Scalar, 此外還有一些如cv::Point3i, Vec4i等,在某些函數使用到時對應即可。在opencv-python中,使用numpy的數據格式進行處理,并不存在Point, Rect, Scalar這些特殊的概念,而是將其一般化了, 比如在繪制圓的時候:
cv2.circle(img, (x, y), radius, color, thickness) #opencv的官方教程速度還真比不上百度
對于圓心,直接使用一個tuple類型就行,不再有cv::Point這樣的特殊數據類型,這樣對于傳參的時候靈活了不少。
對于矩形cv::Rect,在python版本中繪制rectangle則無法使用傳遞(x, y, w, h)這樣的格式,只存有(x0, y0), (x1, y1)這樣傳遞左上和右下點信息來完成
cv2.rectangle(img, (x0, y0), (x1, y1), color, line_width)
對于外接矩形,直接通過x, y, w, h來獲取矩形的信息
x, y, w, h = cv2.boundingRect(contour)
對于cv::Scalar,也直接使用tuple來表示了,如:
img_mean = cv2.mean(img)# (127.549025, 127.6246, 127.67580000000001, 0.0)
返回一個長度為4的tuple,這對應C++的cv::Scalar.
3. 圖像的矩
對于圖像處理,我們的目的是提取圖像特征信息,不論是選取ROI(感興趣區域),還是濾波,邊緣提取等等,而且我們希望提取的特征受到噪聲,幾何形變,光線的影響越少越好,這樣的特征存在么?幸運的是,還真發現了這樣的特征--不變矩。
在OpenCV中,關于矩的使用常用在下面幾個地方:
計算輪廓的質心
# 常伴隨cv2.findContours()使用,cv2.moments第一個參數為點集
img_moments = cv2.moments(contour)
# 計算質心centroid坐標信息cent_x和cent_y
cent_x = int(img_moments['m10']/img_moments['00'])
cent_y = int(img_moments['m01']/img_moments['00'])
通過比較輪廓的矩來進行目標的匹配
對于opencv-python的基礎數據類型,有問題歡迎留言, Have Fun With OpenCV-Python, 下期見。
總結
以上是生活随笔為你收集整理的opencv python教程简书_OpenCV-Python系列二:常用的图像属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打印机服务器总是自动停止,win7系统p
- 下一篇: Himall商城图片帮助类ImageHe