对于图像,我们经常需要知道关于图像的特殊属性,比如宽度,高度,面积,像素点数目等等,那么在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)来修改元素。
参考博客:使用numpy.array访问像素
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, 下期见。
网友评论