美文网首页
OpenCV-Python系列二:常用的图像属性

OpenCV-Python系列二:常用的图像属性

作者: CodeFUN | 来源:发表于2020-06-08 23:43 被阅读0次
    对于图像,我们经常需要知道关于图像的特殊属性,比如宽度,高度,面积,像素点数目等等,那么在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'])
    
    • 通过比较轮廓的矩来进行目标的匹配

    图像的矩特征 https://www.cnblogs.com/ronny/p/3985810.html

    对于opencv-python的基础数据类型,有问题欢迎留言, Have Fun With OpenCV-Python, 下期见。

    相关文章

      网友评论

          本文标题:OpenCV-Python系列二:常用的图像属性

          本文链接:https://www.haomeiwen.com/subject/wulktktx.html