精华内容
下载资源
问答
  • 本篇文章主要讲解灰度直方图的基本概念,Python调用OpenCV实现绘制图像直方图,基础性知识希望对您有所帮助。 1.灰度直方图基本概率 2.绘制直方图 3.使用OpenCV统计绘制直方图

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

    本篇文章主要讲解灰度直方图的基本概念,Python调用OpenCV实现绘制图像直方图,基础性知识希望对您有所帮助。

    • 1.灰度直方图基本概率
    • 2.绘制直方图
    • 3.使用OpenCV统计绘制直方图

    PS:文章参考自己以前系列图像处理文章及OpenCV库函数,同时部分参考网易云李大羊老师的视频,推荐大家去学习。同时,本篇文章涉及到《计算机图形学》基础知识,请大家下来补充。

    该系列在github所有源代码:

    PS:请求帮忙点个Star,哈哈,第一次使用Github,以后会分享更多代码,一起加油。

    同时推荐作者的C++图像系列知识:

    展开全文
  • 这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能.OpenCV中的直方图均衡import cv2import numpy as npfrom matplotlib import pyplot as pltimg = cv2....

    直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法.通过这种方法,亮度可以更好地在直方图上分布.这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能.

    bVbdVSB?w=361&h=151

    OpenCV中的直方图均衡

    import cv2

    import numpy as np

    from matplotlib import pyplot as plt

    img = cv2.imread('img.jpg',0)

    equ = cv2.equalizeHist(img)

    res = np.hstack((img,equ)) #stacking images side-by-side

    cv2.imshow('show',res)

    cv2.waitKey()

    bVbdV2j?w=977&h=370

    CLAHE(对比度有限自适应直方图均衡)

    确实,直方图均衡后背景对比度有所改善.但比较两个图像,由于亮度过高,我们丢失了大部分信息,这是因为它的直方图并不局限于特定区域.

    为了解决这个问题,使用自适应直方图均衡.图像被划分为几个小块,称为“tiles”(在OpenCV中默认值是8x8).然后每一个方块都是像平常一样的直方图,因此,直方图会限制在一个小区域(除非有噪声)。如果噪音在那里,它就会被放大.为了避免这种情况,会应用对比限制.如果任何直方图bin超出指定的对比度限制(默认情况下是40),在应用直方图均衡之前,这些像素被裁剪并均匀地分布到其他bin.均衡后,删除边界中的工件,采用双线性插值.

    代码:

    import cv2

    import numpy as np

    from matplotlib import pyplot as plt

    img = cv2.imread('img.jpg',0)

    # create a CLAHE object (Arguments are optional).

    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))

    cl1 = clahe.apply(img)

    cv2.imshow('show',cl1)

    cv2.waitKey()

    bVbdWjp?w=497&h=370

    展开全文
  • 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(指的是上面截图里的窗口)哪个图上,顺序是从左到右,从上到下

    展开全文
  • 13.3 使用OpenCV绘制直方图 OpenCV提供了函数cv2.calcHist()用来计算图像的统计直方图,该函数能统计各个灰度级的像素点个数。利用matplotlib.pyplot模块中的plot()函数,可以将函数cv2.calcHist()的统计结果绘制成...

    Python版本是Python3.7.3,OpenCV版本OpenCV3.4.1,开发环境为PyCharm

    13.3 使用OpenCV绘制直方图

    OpenCV提供了函数cv2.calcHist()用来计算图像的统计直方图,该函数能统计各个灰度级的像素点个数。利用matplotlib.pyplot模块中的plot()函数,可以将函数cv2.calcHist()的统计结果绘制成直方图。

    1.用cv2.calcHist()函数统计图像直方图信息
    函数cv2.calcHist()用于统计图像直方图信息,其语法格式为:

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

    函数中返回值及参数的含义为:
    ● hist:返回的统计直方图,是一个一维数组,数组内的元素是各个灰度级的像素个数。
    ● images:原始图像,该图像需要使用“[ ]”括起来。
    ● channels:指定通道编号。通道编号需要用“[ ]”括起来,如果输入图像是单通道灰度图像,该参数的值就是[0]。对于彩色图像,它的值可以是[0]、[1]、[2],分别对应通道B、G、R。
    ● mask:掩模图像。当统计整幅图像的直方图时,将这个值设为None。当统计图像某一部分的直方图时,需要用到掩模图像。
    ● histSize:BINS的值,该值需要用“[ ]”括起来。例如,BINS的值是256,需要使用“[256]”作为此参数值。
    ● ranges:即像素值范围。例如,8位灰度图像的像素值范围是[0, 255]。
    ● accumulate:累计(累积、叠加)标识,默认值为False。如果被设置为True,则直方图在开始计算时不会被清零,计算的是多个直方图的累积结果,用于对一组图像计算直方图。该参数允许从多个对象中计算单个直方图,或者实时更新直方图。该参数是可选的,一般情况下不需要设置。

    eg1:使用cv2.calcHist()函数计算一幅图像的统计直方图结果,并观察得到的统计直方图信息。
    根据题目的要求,编写代码如下:

    import cv2
    img=cv2.imread("image\\lena.bmp")
    hist = cv2.calcHist([img],[0],None,[256],[0,255])
    print(type(hist))
    print(hist.shape)
    print(hist.size)
    print(hist)
    

    需要注意,在本例的cv2.calcHist()函数中:
    ● 第1个参数“[img]”表示要绘制直方图的原始图像,是使用“[ ]”括起来的。
    ● 第2个参数表示要统计哪个通道的直方图信息。本例中读取的img是灰度图像,所以使用“[0]”来表示。
    ● 第3个参数是掩模图像,在本例中的值为“None”,表示计算整幅图像的直方图。
    ● 第4个参数“[256]”表示BINS的值是256。
    ● 第5个参数“[0, 255]”表示灰度级的范围是[0, 255]。
    程序运行结果如下图所示。
    在这里插入图片描述

    从图中可以看到,函数cv2.calcHist()返回值的数据类型为“ndarray”。该数据的shape为(256,1),说明其有256行1列。该数据的size为256,说明有256个元素,分别对应着256个灰度级在图像内出现的次数。
    图中所示的程序运行结果的下半部分是hist内的部分数据,限于篇幅,这里仅截取了256条数据中的前6条。这6条数据,对应着灰度级为0~5的像素点出现的次数。

    2.plot()函数的使用
    使用matplotlib.pyplot模块内的plot()函数,可以将函数cv2.calcHist()的返回值绘制为图像直方图。下面通过三个例子来学习plot()函数的基本使用方法。

    eg2:将给定的x= [0,1,2,3,4,5,6], y = [0.3,0.4,2,5,3,4.5,4],使用plot()函数绘制出来。
    根据题目的要求,编写代码如下:

    import matplotlib.pyplot as plt
    x = [0,1,2,3,4,5,6]
    y = [0.3,0.4,2,5,3,4.5,4]
    plt.plot(x,y)
    plt.show(  )   # 显示图像
    

    程序的运行结果如下图所示。图中x轴由x= [0, 1, 2, 3, 4, 5, 6]指定,y轴由y= [0.3, 0.4, 2, 5, 3, 4.5, 4]指定。
    在这里插入图片描述

    eg3:给定y = [0.3, 0.4, 2, 5, 3, 4.5, 4],使用plot()函数将其绘制出来,观察绘制结果。
    :如下代码:

    import matplotlib.pyplot as plt
    y = [0.3,0.4,2,5,3,4.5,4]
    plt.plot(y)
    plt.show(  )   # 显示图像
    

    执行上述程序,运行结果如下图所示。从图中可以看出,在使用plot()函数时,如果仅仅指定一个参数,则其对应x轴的值默认是一个自然数序列x=[0, 1, … , n-1, n]。自然序列x的长度与y的长度保持一致。

    在这里插入图片描述

    eg4:使用plot()函数将两组不同的值a= [0.3, 0.4, 2, 5, 3, 4.5, 4], b=[3, 5, 1, 2, 1, 5, 3]以不同的颜色绘制出来。
    代码如下:

    import matplotlib.pyplot as plt
    a = [0.3,0.4,2,5,3,4.5,4]
    b=[3,5,1,2,1,5,3]
    plt.plot(a,color='r')
    plt.plot(b,color='g')
    plt.show(  )   # 显示图像
    

    上述代码中:
    ● color='r’表示绘图曲线的color属性是“red”,即绘图颜色是红色的。
    ● color='g’表示绘图曲线的color属性是“green”,即绘图颜色是绿色的。
    在绘图时,可以根据需要将color属性设置为不同颜色。执行上述程序,绘图结果如下图所示。

    在这里插入图片描述

    3.绘制统计直方图
    熟悉函数plot()的使用后,就可以使用它将函数cv2.calcHist()的返回值绘制为直方图了。

    eg5:使用函数plot()将函数cv2.calcHist()的返回值绘制为直方图。
    代码如下:

    import cv2
    import matplotlib.pyplot as plt
    o=cv2.imread("image\\boatGray.bmp")
    histb = cv2.calcHist([o],[0],None,[256],[0,255])
    plt.plot(histb,color='b')
    plt.show()
    plt.show(  )   # 显示图像
    

    运行上述程序,得到如下图所示直方图。

    在这里插入图片描述

    本例首先通过函数cv2.calcHist()得到图像的统计直方图数据,然后利用函数plot()将这些数据绘制出来。

    eg6:使用函数plot()和函数cv2.calcHist(),将彩色图像各个通道的直方图绘制在一个窗口内。

    代码如下:

    import cv2
    import matplotlib.pyplot as plt
    o=cv2.imread("image\\girl.bmp")
    histb = cv2.calcHist([o],[0],None,[256],[0,255])
    histg = cv2.calcHist([o],[1],None,[256],[0,255])
    histr = cv2.calcHist([o],[2],None,[256],[0,255])
    plt.plot(histb,color='b')
    plt.plot(histg,color='g')
    plt.plot(histr,color='r')
    plt.show()
    

    运行上述程序,得到如下图所示直方图。
    在这里插入图片描述

    本例先通过函数cv2.calcHist()分别得到[0]、[1]、[2]三个通道(即B、G、R三个通道)的统计直方图数据,然后再通过plot()函数将这些数据绘制成直方图。

    展开全文
  • python opencv绘制直方图

    2021-02-21 23:14:45
    灰度直方图概括了图像的灰度级信息,简单的来说就是每个灰度级图像中的像素个数以及占有率 import cv2 import matplotlib.pyplot as plt import numpy as np img = cv2.imread('hand.jpg',1) ori = img.copy() ...
  • python+opencv绘制直方图

    千次阅读 多人点赞 2019-05-03 22:48:43
    直方图定义 横坐标:图像中各个像素点的灰度级 纵坐标:就有该灰度级的像素个数 归一化直方图 ...灰度直方图,仅仅一件事情,仅仅考虑灰度...pyplot绘制直方图 pyplot提供了类似matlab的绘图框架 import m...
  • 因此,您需要将这个直方图拉伸到两端(如下图所示,来自wikipedia),这就是直方图均衡化的作用(简单来说)。这通常会提高图像的对比度。在这里我们将看到其Numpy实现。之后,我们将看到OpenCV功能。importnumpy as ...
  • python opencv 绘制颜色直方图(曲线)的方法 python绘制颜色直方图的方法很多,查看网友资料后在这自己做个总结 matplotlib.pyplot.hist( ) 来源:matplotlib api解释 x:(n,) array or sequence of (n,) ...
  • python opencv 显示直方图

    千次阅读 2016-08-27 00:03:23
    04-python opencv显示直方图 04-python opencv显示直方图 概述 实现过程 引用与打开图片 灰度图像直方图 分离彩色图像的三通道并显示各通道直方图 在一幅图中绘制彩色图像的灰度直方图 等待键盘输入并关闭...
  • 目录 1 灰度直方图简介 ...3 OpenCV绘制直方图-calcHist() 参考资料 1 灰度直方图简介 1.1 灰度直方图概念 灰度直方图(histogram)是灰度级的函数,描述的是图像中每种灰度级像素的个数,反映...
  • 图像的灰度直方图(histogram),就是将图像转化成灰度图像之后,统计各个像素点的灰度值,绘制直方图,其横轴是灰度值(0,255),纵轴是该灰度值所对应的像素的数目。对灰度直方图做积分=图像的size。灰度直方图...
  •   直方图的 x 轴是灰度值(0 到 255), y 轴是图片中具有同一个灰度值的点的数目。直方图其实就是对图像的另一种解释。通过直方图我们可以对图像的对比度,亮度,灰度分布等有一个直观的认识。 相关术语 BINS: ...
  • 知识储备:图像直方图 直方图是数值数据分布的精确图形表示。 这是一个连续变量(定量变量)的概率分布的估计,并且被卡尔·皮尔逊(Karl Pearson)首先引入。它是一种条形图。 构建直方图: ①将值的范围分段 ②...
  • 直接用matplotlib直方图def plot_demo(image):plt.hist(image.ravel(), 256, [0, 256]) # image.ravel()将图像展开,256为bins数量,[0, 256]为范围plt.show()图像直方图def image_hist(image):color = ('blue',...
  • opencv 绘制直方图

    2018-04-01 21:21:26
    一、话说直方图说到直方图,同学们一定会想到统计学里的直方图(没有想起来的抓紧去翻下中学数学课本)。所谓直方图啊,就是把一大坨东西分成好几部分(横坐标),然后看看每一部分有多少(纵坐标)。比如说康娜酱的...
  • #Opencv python从零开始第二天之直方图 本人大一数学系学渣菜鸟一枚,由于兴趣,课程之余在学习OpenCV, 也是从零开始,想一边学一边把学的东西整理放在CSDN存一下 不喜勿喷哈哈哈哈 我是菜鸡 #python+Opencv 直方图...
  • openCV绘制直方图 先直接放代码: #encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt src = cv2.imread('./out/partition7.jpg') cv2.imshow("src", src) cv2.waitKey(0) cv2....
  • 原标题:深入理解OpenCV+Python直方图均衡化正文直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。基本思想:把原始图的直方图变换为均匀分 布的形式,这样就增加了像素灰度值的动态 范围,从而...
  • OpenCV-直方图

    2021-10-16 16:24:47
    OpenCV-直方图(Python
  • opencv python 直方图

    2018-07-19 15:13:05
    可以将直方图视为图形或绘图,它可以从中全面了解图像的强度分布. 它是在X轴上具有像素值(范围从0到255,并非总是)的图和在Y轴上的图像中的对应像素数. 查找直方图 BINS:像素值区间的像素数.例如将整个直方图分成...
  • 这篇博客将介绍PythonOpenCV中的直方图反投影。**直方图反投影用于图像分割或在图像中查找感兴趣的对象。** 简单地说,它创建了一个与输入图像大小相同(但只有一个通道)的图像,其中每个像素对应于该像素属于感...
  • Python-OpenCV-直方图

    2021-06-30 22:05:26
    用掩膜绘制直方图 一、直方图是什么? 图像直方图是图像内灰度值的统计特性与图像灰度值之间的函数,直方图统计图像内各个灰度级出现的次数。 二、使用步骤 1.引入库 代码如下: import cv2 import numpy ...
  • 1. 全局直方图均衡化cv2.equalizeHist(src, dst=None)函数...直方图均衡化可以看作是图像增强的一个手段,示例代码如下:import cv2 as cvsrc = cv.imread("D:/Open CV/opencv/sources/samples/data/rice_01.jpg"...
  • Histograms - 2: Histogram Equalization 直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法.通过这种方法,亮度可以更好地在直方图上分布.这样就可以用于增强...OpenCV中的直方图均衡 import ...
  • 图像的直方图显示像素的强度值的频率。在图像直方图中,X轴表示灰度强度,Y轴表示这些强度的频率。直方图均衡化提高了图像的对比度,以扩大语义范围。可以使用Imgproc类的equalizeHist()方法来均衡给定图像的直方图...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,588
精华内容 3,035
关键字:

opencv画直方图python

python 订阅