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, 下期见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值