精华内容
下载资源
问答
  • python绘制灰度直方图
    千次阅读
    2022-02-27 23:38:08
    import numpy as np
    import matplotlib.pyplot as plt
    from skimage import io
    import cv2
    
    if __name__ == '__main__':
        imgPath = 'background.png'
        img = io.imread(imgPath)
        n, bins, patches = plt.hist(img.flatten(), bins=256)
        plt.savefig("his.png")
        plt.show()
    
    

    在这里插入图片描述

    更多相关内容
  • Python实现灰度直方图绘制

    千次阅读 2020-11-01 19:31:24
    Python实现灰度直方图绘制 首先要了解灰度直方图的概念。简单说就是,将一幅彩色图片灰度处理之后,图片矩阵元素的灰度值是分布在0-255上的整数,然后去统计不同的值出现的次数,然后将次数作为y,灰度值作为x,绘图...

    Python实现灰度直方图绘制

    首先要了解灰度直方图的概念。简单说就是,将一幅彩色图片灰度处理之后,图片矩阵元素的灰度值是分布在0-255上的整数,然后去统计不同的值出现的次数,然后将次数作为y,灰度值作为x,绘图即可。

    这是我本来写的函数,虽然看着精简,但因为是三重循环,以一张256256像素的图片为例,这样循环次数就来到了256256*256=16,777,216次,1600多万次。所以调用一次,用时半分钟

    def histogram(grayfig):
        x = grayfig.shape[0]
        y = grayfig.shape[1]
        ret = np.zeros(256)
        for i in range(x):
            for j in range(y):
                for k in range(256):
                    if grayfig[i][j] == k:
                        ret[k] += 1
        return ret
    

    总觉得可以优化,想了一会,做出如下改进。也就是说上边三重循环代码中,最里层的循环其实没有多大用处。修改之后,调用一次,只需要0.07秒,比之前的快了600倍。函数入参要求是一个二维矩阵,返回一个数组。入参图片要求是已经做了灰度处理,且值分布在0-255。返回的数组是以灰度值为下标,灰度值出现的次数为值。因此,两重for循环遍历矩阵的每个元素,遍历到之后,将元素的值作为返回数组ret的下标,然后将这个下标的对应的值+1。

    def histogram(grayfig):
        x = grayfig.shape[0]
        y = grayfig.shape[1]
        ret = np.zeros(256)
        for i in range(x):
            for j in range(y):
                ret[grayfig[i][j]] += 1
        return ret
    

    对比之后甚至比系统自带的hist()函数都要快。代码如下:

    begin_time_1 = dt.datetime.now()
    lenaGrayHist_1 = histogram(lenaGray_255)
    end_time_1 = dt.datetime.now()
    print('自己写的hist函数用时:', end_time_1 - begin_time_1)
    plt.plot(range(256), lenaGrayHist_1)
    
    begin_time_2 = dt.datetime.now()
    n, bins, patches = plt.hist(lenaGray_255.flatten(), bins=256)
    end_time_2 = dt.datetime.now()
    print('系统hist函数用时:', end_time_2 - begin_time_2)
    plt.show()
    

    运行结果,图中橙色部分是系统自带hist函数,蓝色包络是自己写的hist函数,可见自己写的函数没有问题,且用时极短。(这种用时比较,并没有特别大的意义,只是针对特定问题做的优化,扩展性自然没有系统自带的好)

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • python写一个绘制图像直方图和累计直方图的函数

            在计算机视觉中,对图像进行预处理时经常会用到图像的直方图、累计直方图等。下面给出一种参考代码,用python绘制图像灰度直方图和累计直方图。

           

    # -*- coding: utf-8 -*-
    """
    Created on Mon Jan 10 13:37:32 2022
    @author: 2540817538(有问题请联系该QQ)
    python3.8.8
    """
    
    import numpy as np
    import matplotlib.pyplot as plt
    from PIL import Image
    
    def histogram(grayfig):#绘制直方图
        x = grayfig.size[0]
        y = grayfig.size[1]
        ret = np.zeros(256)
        for i in range(x):  #遍历像素点获得灰度值
            for j in range(y):
                k = grayfig.getpixel((i,j))
                ret[k] = ret[k]+1
        for k in range(256):
            ret[k] = ret[k]/(x*y)
        return ret#返回包含各灰度值占比的数组
    
    def histogram_sum(grayfig):#绘制累计直方图
        x = grayfig.size[0]
        y = grayfig.size[1]
        ret = np.zeros(256)
        for i in range(x):
            for j in range(y):
                k = grayfig.getpixel((i,j))
                ret[k] = ret[k]+1
        for k in range(1,256):
            ret[k] = ret[k]+ret[k-1]#累加
        for k in range(256):
            ret[k] = ret[k]/(x*y)
        return ret
    
    im = Image.open('C:/Users/25408/Desktop/p1.jpg')#注意更改路径
    im.show()
    im_gray = im.convert('L')#获得灰度图
    im_gray.show()
    
    lenaGrayHist_1 = histogram(im_gray)
    lenaGrayHist_2 = histogram_sum(im_gray)
    
    plt.figure()
    plt.rcParams['font.sans-serif'] = ['SimHei']#用来正常显示中文标签
    plt.title("普通直方图")
    plt.bar(range(256),lenaGrayHist_1,color='y')
    
    plt.figure()
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.title("累计直方图")
    plt.bar(range(256),lenaGrayHist_2)

    效果如下:

    输入的图像:

    绘制结果:

     

     

     

    展开全文
  • 图像的灰度直方图(histogram),就是将图像转化成灰度图像之后,统计各个像素点的灰度值,绘制成直方图,其横轴是灰度值(0,255),纵轴是该灰度值所对应的像素的数目。对灰度直方图做积分=图像的size。灰度直方图...

    图像直方图(histogram)是图像的统计学特征,常用于了解图像的基本特征以便分析。不过图像的直方图不具有空间特征。

    图像的灰度直方图(histogram),就是将图像转化成灰度图像之后,统计各个像素点的灰度值,绘制成直方图,其横轴是灰度值(0,255),纵轴是该灰度值所对应的像素的数目。对灰度直方图做积分=图像的size。

    灰度直方图

    1 defplt_hist(img):2 plt.hist(img.ravel(), 256, [0, 256])3 plt.show()

    三色折线图(可以直观的看出三原色的占比分布)

    1 defimg_hist(img):2 color = ("blue", "green", "red")3 for i, color inenumerate(color):4 hist = cv.calcHist([img], [i], None, [256], [0, 256])5 plt.plot(hist, color=color)6 plt.xlim([0, 25])7 plt.show()

    一般来说,直方图有双峰性,会有两个峰值以区分前景和背景,但并不是每张图像都如此。分析图像的变化,进而确定最优二值化值。在两个峰值之间的最小值,经常是我们需要找的二值化值。我们可以发现,两个峰值之间的波谷是两个峰值的叠加区。有了灰度直方图,我们可以给图片做二值化。确定哪些pixel是我们需要关注的哪些是不重要的。二值化有两种主要形式:一种是全局阈值二值化,另外一种是局部阈值二值化。

    选择二值化的值(找到两个双峰的最低点,但不是都有多峰可能存在多个最小值,可以用局部阈值)

    经典算法:isodata algorithm 预设初始的二值化值,然后不断迭代,效果不是最好的

    Otsu algorithm 研究双峰的关联性求二值化值

    Entropy algorithm 熵算法,前景熵hb和背景熵hw。0-255个灰度值分别求熵,最大的h值就是我们要找的二值化值。

    其他算法:triangle algorithm 灰度值的最大值和最左侧的最小值连接,然后做垂线,当垂线距离最大时,所对应的灰度值就是我们需要的二值化值,不过这个算法效果不是很好,应用于细胞分离比较多。

    使用opencvAPI:(otsu和triangle)

    1 defthreshold_binary(src):2 #把BGR图像转化成灰度图像

    3 gray =cv.cvtColor(src, cv.COLOR_BGR2GRAY)4 #获得灰度直方图以便调整算法的使用

    5 plt.hist(src.ravel(), 256, [0, 256])6 plt.show()7 #几种二值化方法

    8 ret, binary = cv.threshold(gray, 50, 255, cv.THRESH_BINARY)#指定阈值50

    9 print("二值阈值: %s" %ret)10 cv.imshow("threshold_binary", binary)11 ret_otsu, binary_otsu = cv.threshold(gray, 0, 255, cv.THRESH_BINARY |cv.THRESH_OTSU)12 print("二值阈值_otsu: %s" %ret_otsu)13 cv.imshow("threshold_binary_otsu", binary_otsu)14 ret_tri, binary_tri = cv.threshold(gray, 0, 255, cv.THRESH_BINARY |cv.THRESH_TRIANGLE)15 print("二值阈值_tri: %s" % ret_tri)

    运行示例:

    1631778-20190817125248967-1479903901.png

    二值阈值: 50.0

    二值阈值_otsu: 173.0

    二值阈值_tri: 250.0

    以上是全局阈值二值化的结果,下面还有局部阈值二值化。个人觉得局部阈值更好的描绘了图片的轮廓。

    1 deflocal_threshold_binary(src):2 gray =cv.cvtColor(src, cv.COLOR_BGR2GRAY)3 binary_mean = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 25, 10)4 cv.imshow("binary_mean", binary_mean)5

    6 binary_gau = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)7 cv.imshow("binary_gau", binary_gau)

    两种方法,

    1631778-20190817130357214-929475707.png

    超大图像及其二值化

    经常会遇到一些比较大的图像,我们可以把图片拆分成很多个小方块分别进行全局二值化或者使用局部阈值。这时候可以用opencv处理图像显示不全,需要把图片保存到本地才行。

    1 defbig_image_binary(src):2 print(src.shape)3 cw = 256

    4 ch = 256

    5 h, w, c =src.shape6 gray =cv.cvtColor(src, cv.COLOR_BGR2GRAY)7 for row inrange(0, h, ch):8 for col inrange(0, w, cw):9 roi = gray[row:row+ch, col:col+cw]10 dst = cv.adaptiveThreshold(roi, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)11 #ret_otsu, dst = cv.threshold(roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)

    12 gray[row:row+ch, col:col+cw] =dst13 #计算方差和平均值,当这两个数值小于某一值时,可以认为图像为空白,做空白图像过滤

    14 print(np.std(dst), np.mean(dst))15 cv.imwrite("E:/photo/big_img_binary.jpg", gray)

    1631778-20190817131406692-1271455787.jpg

    1631778-20190817131317516-67850923.jpg

    展开全文
  • 图像灰度直方图灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率。直方图显示图像数据时会以左暗右亮的分布曲线形式呈现出来。横坐标是灰度级,纵坐标是该灰度级出现的频率。图像...
  • Python+OpenCV)绘制灰度直方图

    千次阅读 2020-11-29 17:15:58
    绘制单通道直方图和RGB三通道直方图。 IDE:Jupyter Lab #!/usr/bin/env python # coding: utf-8 # In[13]: import sys import cv2 as cv import matplotlib.pyplot as plt # In[14]: print('Python的...
  • 思路:先把图片转换为灰度图,然后根据灰度值的分布来绘制直方图 使用方法:matplotlib库,hist函数,revel()函数 ...具体实践:将彩色图转换为灰度图,并绘制灰度图的直方图,显示灰度图和直方图 #!/usr/bin/env
  • 1,直方图的概念 图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值...图像的灰度直方图是灰度级的函数,描述的是图像中具有该灰
  • 我将图像加载到numpy数组中,并希望在直方图绘制其颜色值.import numpy as npfrom skimage import iofrom skimage import colorimg = io.imread('img.jpg')img = color.rgb2gray(img)unq = np.unique(img)unq = np....
  • plt.figure("lena") arr=img.flatten() n, bins, patches= plt.hist(arr, bins=256, normed=1, facecolor='green', alpha=0.75) plt.show() 二、彩色图片直方图 实际上是和灰度直方图一样的,只是分别画出三通道的...
  • 灰度直方图在数据统计分析、图像处理中有着比较广泛的应用,下面就介绍一下如何使用python绘制灰度直方图
  • Python计算并绘制灰度直方图

    万次阅读 2019-11-09 19:56:11
    灰度直方图 灰度直方图是关于灰度级分布的函数,将数字图像中的所有像素,按照灰度值的大小,统计其出现的频率。其中,横坐标是灰度级,纵坐标是该灰度级出现的频率。 如果将图像总像素亮度(灰度级别)看成是一个...
  • 我设法解决了这个问题:import cv2import numpy as np#Create window to display imagecv2.namedWindow('colorhist', cv2.CV_WINDOW_AUTOSIZE)#Set hist parametershist_height = 64hist_width = 256nbins = 32bin_...
  • from PIL import Imagefrom pylab import *from numpy import *def histeq(im,nbr_bins = 256):"""对一幅灰度图像进行直方图均衡化"""#计算图像的直方图#在numpy中,也提供了一个计算直方图的函数histogram(),第一个...
  • 女性时尚流行美容健康娱乐mv-ida网 mvida时尚娱乐网 首页 美容 护肤 化妆技巧 发型 服饰 健康 情感 美体 美食 娱乐 明星八卦 首页 > 高级搜索 python opencv处理 图像 之 图像 直方图...
  • 在图像处理中,直方图是非常重要,也是非常有用的一个处理要素。在skimage库中对直方图的处理,是放在exposure这个模块中。1、计算直方图函数:skimage.exposure.histogram(image,nbins=256)在numpy包中,也提供了一...
  • 通过直方图可以对图像灰度分布有一个整体了解,x轴上是灰度值(0到255),y轴是图片中该灰度值的像素点的数目。 理解为图片整体各项数据的直观认识
  • 灰度直方图概括了图像的灰度级信息,简单的来说就是每个灰度级图像中的像素个数以及占有率,创建直方图无外乎两个步骤,统计直方图数据,再用绘图库绘制直方图。统计直方图数据首先要稍微理解一些与函数相关的术语,...
  • I have been having difficulty trying to generate a histogram for a 640x480 grayscale image I am working with.I am using Python 2.7.3, OpenCV 2.4.6 (Python bindings) and NumpyThe image below was genera...
  • 本文主要介绍如何使用pythono-opencv绘制灰度图像的直方图,并且进行直方图均衡处理。
  • 1 灰度直方图简介 1.1 灰度直方图概念 1.2 灰度直方图作用 1.3 绘制的直方图 1.4 归一化直方图 2 matplotlib库 绘制直方图-hist() 3 OpenCV库 绘制直方图-calcHist() 参考资料 1 灰度直方图简介 1.1 灰度...
  • 基于opencv的灰度直方图绘制与图像二值化
  • 本篇文章主要讲解灰度直方图的基本概念,Python调用OpenCV实现绘制图像直方图,基础性知识希望对您有所帮助。 1.灰度直方图基本概率 2.绘制直方图 3.使用OpenCV统计绘制直方图
  • 图像的灰度直方图(histogram),就是将图像转化成灰度图像之后,统计各个像素点的灰度值,绘制成直方图,其横轴是灰度值(0,255),纵轴是该灰度值所对应的像素的数目。对灰度直方图做积分=图像的size。灰度直方图1 ...
  • 最大值 pyplot.axis([0, 256, 0, 1]) #显示网格线 pyplot.grid(True) #key正好就是灰度 keys = histogram.keys() #value是灰度的像素数量,这里是归一化之后的 values = histogram.values() #这里正式绘制直方图 ...
  • 灰度直方图在数据统计分析、图像处理中有着比较广泛的应用,下面就介绍一下如何在Python中使用matplotlib来绘制灰度直方图。下面直接看代码:import matplotlib.pyplot as pltimport numpy as nprandom_state = np....
  • 三通道灰度直方图绘制代码(含解释)Opencv中的cv2.calcHist()函数的作用及返回值 - 百度文库 (baidu.com) 三、补充知识 1、cv2.imread(filename, flags) 参数: filepath:读入imge的完整路径 flags:标志位,{...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,949
精华内容 1,179
关键字:

python绘制灰度直方图