精华内容
下载资源
问答
  • 本文介绍了OpenCV-Python图像像素位深表示的方法,并举例介绍在图像运算中使用位深格式来确保图像运算结果没有溢出和丢失,但在OpenCV中非8位深只适合作为中间图像存储使用,最终图像的位深最好还是使用8位位深...

    ☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython

    一、引言

    在《图像表示的相关概念:图像深度、像素深度、位深的区别和关系:https://blog.csdn.net/LaoYuanPython/article/details/109569968》中介绍了图像深度、像素深度、位深的区别和关系。在OpenCV中使用矩阵存储图像,一般情况下图像矩阵每个像素的通道数为8位,即位深为8位,通道数由图像本身决定,灰度图单通道、彩色图有3通道和4通道,但OpenCV在图像处理过程中允许扩展位深以支持复杂的运算如乘法和除法。

    二、OpenCV图像像素表示法

    为了支持灵活的位深模式,OpenCV对位深定义了专用的常量来表示,相关定义格式如下:
    位深常量 = 'CV_'+位深+通道数据类型(S|U|F)+‘C'+’通道数
    其中数据类型取值含义如下:S = 符号整型 U = 无符号整型 F = 浮点型

    如:CV_8UC1 表示一个8位无符号整型单通道,CV_32FC2表示一个32位浮点型双通道, CV_16SC4表示一个16位带符

    展开全文
  • OpenCV Python 直方图

    万次阅读 2016-06-01 00:08:20
    OpenCV Python 直方图OpenCV Python 直方图 直方图 什么是直方图 直方图的作用 敲程序 使用matplotlib计算直方图 代码 出现错误 解决办法 运行结果 输出一个彩色图像的直方图 代码 运行效果 代码讲解 使用掩模 代码 ...

    OpenCV Python 直方图


    直方图

    什么是直方图

    直方图的作用

    敲程序

    下面为使用PythonOpenCVmatplotlib来编写几个samples程序来实际感受一下图像的直方图:

    使用matplotlib计算直方图

    代码

    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    img = cv2.imread('~/Pictures/IMG_4137.JPG', 0)
    plt.hist(img.ravel() , 256, [0, 256])
    plt.show()

    出现错误

    上面的这段程序,你运行会出现这样的error:

    Traceback (most recent call last):
      File "/home/aobo/PycharmProjects/OpenCV2/Histograms/hist.py", line 6, in <module>
        plt.hist(img.ravel() , 256, [0, 256])
    AttributeError: 'NoneType' object has no attribute 'ravel'

    解决办法

    将代码里的下面这行

    img = cv2.imread('~/Pictures/IMG_4137.JPG', 0)

    修改为:(图片路径使用完整的绝对路径)

    img = cv2.imread('/home/aobo/Pictures/IMG_4137.JPG', 0)

    错误的原因是:img变量没有成功的载入图片(cv2.imread()),所以这个img变量就是一个没有任何变量类型的一个变量,在Python语言里img现在就是一个NoneType对象。因为只要Mat对象才有ravel()这个方法,而NoneType对象没有,所以才出现了上面的error

    img.ravel() 将图像转成一维数组。

    运行结果:

    Figure 1


    输出一个彩色图像的直方图

    代码

    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    img = cv2.imread('/home/aobo/Pictures/IMG_4137.JPG')
    color = ('b','g','r')
    # enumerate():python里的一个新函数
    # 它的作用:同时遍历索引(i)和元素(col)
    for i,col in enumerate(color):
        histr = cv2.calcHist([img], [i], None, [256], [0, 256])
        plt.plot(histr, color = col)
        plt.xlim([0, 256])
    plt.show()

    运行效果

    Figure 1

    代码讲解

    histr = cv2.calcHist([img], [i], None, [256], [0, 256])

    cv2.calcHist()是OpenCV里面求直方图的函数。下面介绍这个函数需要传入的形参:

    cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

    实参对应形参解释
    [img]images原始图像,需要使用[]修饰
    [i]channelscv2.calcHist()函数一次只能得到一张图片的其中一个通道的直方图,所以,这里传入的是本次需要处理的元素图片的通道的索引号,同样需要使用[]修饰。如果输入的元素图像是灰度图,它的值就是[0]; 如果输入的元素图像是彩色图像的话,传入的参数可以是[0], [1], [2],它们分别对应着通道B, G, R。
    plt.plot(histr, color = col)

    这句话中的col的值是:’b’, ‘g ’ 或 ‘r’,赋给color形参,函数会自动处理成形应的颜色值,用这个颜色值将histr直方图绘制到plt画板上。

    plt.xlim([0, 256])

    设置plt画板x轴的上下限,就是x轴所显示的长度。我们将这段代码修改出下面这个样子,然后运行程序,会得到下面的结果:

    plt.xlim([0, 100])

    Figure 1


    使用掩模

    代码

    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    img = cv2.imread('/home/aobo/Pictures/IMG_4137.JPG')
    color = ('b','g','r')
    
    mask = np.zeros(img.shape[:2], np.uint8)
    mask[1000:2000, 1000:2000] = 255
    masked_img = cv2.bitwise_and(img, img, mask = mask)
    
    hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
    hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])
    
    plt.subplot(221), plt.imshow(img, 'gray')
    plt.subplot(222), plt.imshow(mask, 'gray')
    plt.subplot(223), plt.imshow(masked_img, 'gray')
    plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
    plt.xlim([0, 256])
    
    plt.show()

    运行效果

    <注>:当原始图像使用较大图像的时候,你会发现程序运行后需要好久才能得到下面的结果。
    Figure 1

    代码解释

    mask = np.zeros(img.shape[:2], np.uint8)
    mask[1000:2000, 1000:2000] = 255

    制作一个掩模。首先使用np.zeros()函数创建一个与原图尺寸和深度都一样,像素值全为0(黑色)图像mask,然后指定mask掩模的[1000:2000, 1000:2000]区域的像素全为255(白色)。上图右上角的图就是掩模图像。

    masked_img = cv2.bitwise_and(img, img, mask = mask)

    现在掩模发挥了作用:掩模的黑色区域(像素值为0)用来遮盖原图img,即不参与图像处理,只保留像素值不为0的区域。masked_img图像就是上图左下角的图像。
    cv2.bitwise_and()函数的功能是位与。下面是这个函数的声明:

    cv2.bitwise_and(src1, src2[, dst[, mask]])

    当前代码里,对应的src1src2是同一种数据类型,所以此时cv2.bitwise_and()函数执行的是下面的操作:
    Alt text

    hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
    hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])

    分别计算出原图img的直方图和img掩模区域的直方图。

    plt.subplot(221), plt.imshow(img, 'gray')
    plt.subplot(222), plt.imshow(mask, 'gray')
    plt.subplot(223), plt.imshow(masked_img, 'gray')
    plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
    plt.xlim([0, 256])

    subplot()matplotlib.pyplot里的函数。它是:将多个图画到一个平面上的工具。

    subplot(m, n, p) 或者subplot(mnp)

    m表示图排成m行
    n表示图排成n列
    p表示将图画到Figure(指的是上面截图里的窗口)哪个图上,顺序是从左到右,从上到下

    展开全文
  • OpenCV-Python图像像素位深表示法以及应用.rar
  • opencv-python 支持python2 32
  • opencv python 5 平滑滤波

    千次阅读 2017-11-30 09:37:48
    opencv python 5 平滑滤波2D卷积opencv提供了cv2.filter2D()函数来对图像进行卷积操作(图像滤波)。 第1个参数为输入图像,第2个参数为输出图像深度,-1为与原图相同,第3个参数为卷积核。如使用一个5x5的均值...

    opencv python 5 平滑滤波

    2D卷积

    opencv提供了cv2.filter2D()函数来对图像进行卷积操作(图像滤波)。

    dst = cv.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
    • dst:输出图像
    • src:输入图像
    • ddepth:输出图像深度,-1为与原图相同
    • kernel:卷积核
    • anchor:锚点,默认为(-1, -1),指卷积核的中心点
    • delta:输出结果时的附加值,默认为0
    • borderType:边界模式,默认为BORDER_DEFAULT

    如使用一个5x5的均值滤波器对图像作均值滤波:

    import cv2
    import numpy as np 
    
    img = cv2.imread('a.jpg', 0)
    kernel = np.ones((5, 5), np.float32) / 25
    res = cv2.filter2D(img, -1, kernel)
    cv2.imshow('res', res)
    cv2.waitKey()

    图像模糊

    图像模糊即使用低通滤波器对图像作卷积,可以有效地消除噪声。

    均值滤波

    均值滤波即直接取核中每个像素的均值,由cv2.blur()实现。

    dst = cv.blur(src, ksize[, dst[, anchor[, borderType]]])
    • dst:输出图像
    • src:输入图像
    • ksize:模糊核的大小
    • anchor:锚点,默认为(-1, -1),指卷积核的中心点
    • borderType:边界模式,默认为BORDER_DEFAULT
    res = cv2.blur(img, (5, 5))

    高斯滤波

    cv2.GaussianBlur()根据像素距离使用高斯函数生成权重进行滤波。

    dst = cv.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])
    • dst:输出图像
    • src:输入图像
    • ksize:卷积核的大小
    • sigmaX:x方向上的标准差
    • sigmaY:y方向上的标准差
    • borderType:边界模式,默认为BORDER_DEFAULT

    若只给了一个sigma则同时视为两轴的sigma,若均为0则根据尺寸自动生成。

    res = cv2.GaussianBlur(img, (5, 5), 0)

    中值滤波

    cv2.medianBlur()取核中每个像素的中值作为该像素的值。

    dst = cv.medianBlur(src, ksize[, dst])
    • dst:输出图像
    • src:输入图像
    • ksize:卷积核的大小
    res = cv2.medianBlur(img, 5)

    双边滤波

    cv2.bilateralFilter()双边滤波在高斯滤波的基础上增加了灰度值的影响,可以有效地在保持边缘清晰的情况下去除噪声,但速度较慢。

    dst = cv.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])
    • dst:输出图像
    • src:输入图像
    • d:计算像素范围的直径
    • sigmaColor:色彩空间的sigma
    • sigmaSpace:协同空间的sigma
    • borderType:边界模式,默认为BORDER_DEFAULT
    res = cv2.bilateralFilter(img, 9, 75, 75)

    展开全文
  • opencv python 6 图像梯度

    2017-12-25 15:17:56
    opencv python 6 图像梯度Sobel和scharr算子cv2.Sobel()实现了带方向的图像梯度计算。dst = cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]]) dst:输出图像 src:输入图像 ddepth...

    opencv python 6 图像梯度

    Sobel和scharr算子

    cv2.Sobel()实现了带方向的图像梯度计算。

    dst = cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])
    • dst:输出图像
    • src:输入图像
    • ddepth:输出图像深度
    • dx:x方向上的求导阶数
    • dy:y方向上的求导阶数
    • ksize:算子宽度,默认为3
    • scale:缩放比例,默认为1
    • delta:输出结果时的附加值,默认为0
    • borderType:边界模式,默认为BORDER_DEFAULT
    import cv2 
    
    img = cv2.imread('a.jpg', 0)
    sx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize = 5)
    cv2.imshow('sobel', sx)
    cv2.waitKey()

    若ksize为-1,则使用3x3的scharr算子:

    (x方向,y方向则取转置)

    否则使用普通的Sobel算子,如dx=1,dy=0,ksize=3时:

    Laplacian算子

    cv2.Laplacian()

    dst = cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
    • dst:输出图像
    • src:输入图像
    • ddepth:输出图像深度
    • ksize:算子宽度,默认为1
    • scale:缩放比例,默认为1
    • delta:输出结果时的附加值,默认为0
    • borderType:边界模式,默认为BORDER_DEFAULT
    l = cv2.Laplacian(img, cv2.CV_64F)

    若ksize为1,则使用:

    否则对图像的x和y方向作Sobel操作后相加:

    展开全文
  • 例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要,鼻梁两侧比鼻梁颜色要,嘴巴比周围颜色要等。opencv api要想使用opencv,就必须先知道其能干什么,怎么做。于是API的重要性便体现出来...
  • openCv python 使用笔记

    2018-05-20 22:08:40
    OpenCv 是Intel开发的一个图像处理库,它是用C++写的,在图像处理和机器视觉领域发挥巨大作用。目前不管是商业还是非商业用途都是开源免费的。 现在来了解一下图像,图像的构成  图像是由多个像素构成的,每一个...
  • 1图像叠加可以通过OpenCV函数cv.add()或简单地通过numpy操作添加两个图像,res = img1 + img2.两个图像应该具有相同的深度和类型,或者第二个图像可以是标量值.NOTE:OpenCV添加是饱和操作,也就是有上限值,而...
  • opencv Python实现之图像平滑处理 Q:什么是图像平滑处理? A:在尽量保留图像原有信息的情况下,过滤掉图像内部的噪声,这一过程称为对图像的平滑处理,所得的图像称为平滑图像 图像平滑处理的基本原理是:将噪声所在...
  • 可以通过OpenCV函数cv.add()或简单地通过numpy操作添加两个图像,res = img1 + img2.两个图像应该具有相同的深度和类型,或者第二个图像可以是标量值. NOTE: OpenCV添加是饱和操作,也就是有上限值,而Numpy添加...
  • opencv python图像的灰度变换

    千次阅读 2018-08-28 11:18:23
    pythonopencv图像处理实验(一)—灰度变换 ...
  • openCV python低通滤波方法汇总

    千次阅读 2019-04-28 14:40:48
    openCV提供的函数 cv2.filter2D() 实现了对图像的卷积基本操作,我们可以自行设计卷积核,实现均值滤波,高斯滤波等 函数 cv2.filter2D(src,ddepth,kernel[,anchor[,delta[,borderType]]]) 概述: 使用卷积...
  • 1, image format: (a) bmp: lossless, but too large. (b) jpg: very popular, loss. ... ok, we will try to save image in png format. ...2, save image in png format using OpenCV C++ refe...
  • 什么是OpenCV-Python?OpenCV是一个开源的计算机视觉(computer vision)和机器学习库。它拥有超过2500个优化算法,包括经典和最先进的计算机视觉和机器学习算法。它有很多语言接口,包括Python、Java、c++和Matlab。...
  • how can you make it in python? I faced a problem with this lineimg_rgb.Set(mask,cv2.Scalar(0,0,255))and here is the code :import numpy as npimport imutilsimport cv2img_rgb = cv2.imread('figi.jpg')Conv...
  • python 打开浏览器,可以做简单的刷网页的小程序 and 其他有想象力的程序。不过仅供学习,勿用非法用途。python的webbrowser模块支持对浏览器进行一些操作主要有以下三个方法:webbrowser.open(url,new=0,autoraise=...
  • flipCode水平垂直翻转(先沿X轴翻转,再沿Y轴翻转,等价于旋转180°) Python实现: src = cv.imread("D://Image/lena.jpg") h, w, ch = src.shape cv.imshow("input", src) dst = np.zeros(src.shape, src.dtype) ...
  • 文章目录1.文章地图2.思维导图 1.文章地图 GUI 图片 视频 绘图函数+鼠标 基本操作 图像基础操作 图像运算 程序性能检测 图像处理 颜色空间转换 几何变换 图像阈值 形态学转换 ...SIFT + S...
  • 首先介绍图像的混合加权函数 addWeighted 函数原型: addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) -> dst 第一个参数,src1,表示需要加权的第一个图像 第二个参数,alpha,表示第一个图像的...
  • 关于Python Opencv中图像深度的问题

    千次阅读 2019-03-13 11:10:39
    cv2.error: OpenCV(4.0.0) c:\projects\opencv-python\opencv\modules\imgproc\src\color.hpp:261: error: (-2:Unspecified error) in function '__cdecl cv::CvtHelper,-1,-1>,struct cv::Set,4,-1>,struct cv::Set...
  • Opencv 16深度图片显示并保存

    万次阅读 2018-07-11 19:22:14
    同事已经通过FPGA+USB的方式,把相机并行数据转成串行,我需要做的就是上位机,找到frame valid和line valid有,读取一个frame的数据后,显示出来。设计思路: 三个thread,第一个从usb读数据,第二个处理usb...
  • 使用opencv读取图像,直接返回numpy.ndarray 对象,通道顺序为BGR ,注意是BGR,通道值默认范围0-255。 PIL.Image.open 不直接返回numpy对象,RGB,可以用numpy提供的函数进行转换,参考Image和Ndarray互相转换; ...
  • opencv python(四) ---- 颜色空间转换、获取特定颜色图像RGB和HSVRGBHSV颜色空间转换三级目录 RGB和HSV RGB RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好像有红、绿、蓝三盏灯,当它们的光相互...
  • OpenCV Python教程(3、直方图的计算与显示) 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识、用途什么的就直接略过去了。这里直接介绍...
  • OpenCV-Python图形图像处理专栏文章目录

    千次阅读 多人点赞 2020-10-19 21:52:06
    OpenCV-Python图像与运算bitwise_and函数详解 OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减法的差异对比 OpenCV-Python图像的加法运算cv2.add函数详解 OpenCV-Python图像融合cv2.addWeighted权重...
  • Python-opencv读取深度图像

    万次阅读 2018-11-26 14:24:33
    由于实验需要用到Kinect2.0采集的深度图像,但是用以下程序读取深度图片的时候显不方便观察 temp_img= 'cup_depth.png' depth_filename = os.path.join(image_dir,depth_img) temp_filename = os.path.join...
  • 配好了OpenCVPython环境,OpenCVPython环境搭建。于是迫不及待的想体验一下opencv的人脸识别,如下文。必备知识Haar-likeHaar-like百科释义。通俗的来讲,就是作为人脸特征即可。Haar特征值反映了图像的灰度变化...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,540
精华内容 4,216
关键字:

opencvpython位深

python 订阅