精华内容
下载资源
问答
  • 直方图规定化

    2016-05-23 20:42:05
    编程实现两种直方图规定化方式。1:以一幅图像为参考,对另一幅图像进行点运算,使其直方图的分布与参考图像的直方图分布尽量一致,显示参考图像和处理后图像的累计直方图。2:以一个给定的高斯分布的直方图为参考,...
  • 直方图规定化应用:举个例子,当我们需要对多张图像进行拼接时,我们希望这些图片的亮度、饱和度保持一致,事实上就是让它们的直方图分布一致,这时就需要直方图规定化直方图规定化与均衡化的思想一致,事实上就是...

    以下内容需要直方图均衡化、规定化知识

    直方图均衡化应用:

    图像直方图均衡化能拉伸灰度图,让像素值均匀分布在0,255之间,使图像看起来不会太亮或太暗,常用于图像增强;

    直方图规定化应用:

    举个例子,当我们需要对多张图像进行拼接时,我们希望这些图片的亮度、饱和度保持一致,事实上就是让它们的直方图分布一致,这时就需要直方图规定化。

    直方图规定化与均衡化的思想一致,事实上就是找到各个灰度级别的映射关系。具体实现的过程中一般会选一个参考图像记为A,找到A的直方图与目标图像的直方图的映射关系,从而找到目标图像的像素以A为“参考”时的映射关系。

    具体实现可参考文中链接(看完茅塞顿开)

    基于python利用直方图规定化统一图像风格

    参考图像

    原始图像(第一行)/处理后的图像(第二行)

    源码:

    import os

    import cv2

    import numpy as np

    def get_map(Hist):

    # 计算概率分布Pr

    sum_Hist = sum(Hist)

    Pr = Hist/sum_Hist

    # 计算累计概率Sk

    Sk = []

    temp_sum = 0

    for n in Pr:

    temp_sum = temp_sum + n

    Sk.append(temp_sum)

    Sk = np.array(Sk)

    # 计算映射关系img_map

    img_map = []

    for m in range(256):

    temp_map = int(255*Sk[m] + 0.5)

    img_map.append(temp_map)

    img_map = np.array(img_map)

    return img_map

    def get_off_map(map_): # 计算反向映射,寻找最小期望

    map_2 = list(map_)

    off_map = []

    temp_pre = 0 # 如果循环开始就找不到映射时,默认映射为0

    for n in range(256):

    try:

    temp1 = map_2.index(n)

    temp_pre = temp1

    except BaseException:

    temp1 = temp_pre # 找不到映射关系时,近似取向前最近的有效映射值

    off_map.append(temp1)

    off_map = np.array(off_map)

    return off_map

    def get_infer_map(infer_img):

    infer_Hist_b = cv2.calcHist([infer_img], [0], None, [256], [0,255])

    infer_Hist_g = cv2.calcHist([infer_img], [1], None, [256], [0,255])

    infer_Hist_r = cv2.calcHist([infer_img], [2], None, [256], [0,255])

    infer_b_map = get_map(infer_Hist_b)

    infer_g_map = get_map(infer_Hist_g)

    infer_r_map = get_map(infer_Hist_r)

    infer_b_off_map = get_off_map(infer_b_map)

    infer_g_off_map = get_off_map(infer_g_map)

    infer_r_off_map = get_off_map(infer_r_map)

    return [infer_b_off_map, infer_g_off_map, infer_r_off_map]

    def get_finalmap(org_map, infer_off_map): # 计算原始图像到最终输出图像的映射关系

    org_map = list(org_map)

    infer_off_map = list(infer_off_map)

    final_map = []

    for n in range(256):

    temp1 = org_map[n]

    temp2 = infer_off_map[temp1]

    final_map.append(temp2)

    final_map = np.array(final_map)

    return final_map

    def get_newimg(img_org, org2infer_maps):

    w, h, _ = img_org.shape

    b, g ,r =cv2.split(img_org)

    for i in range(w):

    for j in range(h):

    temp1 = b[i,j]

    b[i,j] = org2infer_maps[0][temp1]

    for i in range(w):

    for j in range(h):

    temp1 = g[i,j]

    g[i,j] = org2infer_maps[1][temp1]

    for i in range(w):

    for j in range(h):

    temp1 = r[i,j]

    r[i,j] = org2infer_maps[2][temp1]

    newimg = cv2.merge([b,g,r])

    return newimg

    def get_new_img(img_org, infer_map):

    org_Hist_b = cv2.calcHist([img_org], [0], None, [256], [0,255])

    org_Hist_g = cv2.calcHist([img_org], [1], None, [256], [0,255])

    org_Hist_r = cv2.calcHist([img_org], [2], None, [256], [0,255])

    org_b_map = get_map(org_Hist_b)

    org_g_map = get_map(org_Hist_g)

    org_r_map = get_map(org_Hist_r)

    org2infer_map_b = get_finalmap(org_b_map, infer_map[0])

    org2infer_map_g = get_finalmap(org_g_map, infer_map[1])

    org2infer_map_r = get_finalmap(org_r_map, infer_map[2])

    return get_newimg(img_org, [org2infer_map_b, org2infer_map_g, org2infer_map_r])

    if __name__ == "__main__":

    dstroot = './imgs'

    infer_img_path = './abc.png'

    infer_img = cv2.imread(infer_img_path)

    outroot = './out1'

    infer_map = get_infer_map(infer_img) # 计算参考映射关系

    dstlist = os.listdir(dstroot)

    for n in dstlist:

    img_path = os.path.join(dstroot, n)

    print(img_path)

    img_org = cv2.imread(img_path)

    new_img = get_new_img(img_org, infer_map) # 根据映射关系获得新的图像

    new_path = os.path.join(outroot, n)

    cv2.imwrite(new_path, new_img)

    展开全文
  • 直方图均衡化(Histogram equalization)与直方图规定化

    万次阅读 多人点赞 2017-12-17 17:07:26
    心血来潮,想写一写直方图均衡化。...1、为什么要做直方图均衡化与直方图规定化 在现实的拍摄过程中,比如说视频监控领域,由于其图像的灰度分布集中在较窄的范围内,这就导致了图像的细节不够清晰。为什...

    心血来潮,想写一写直方图均衡化。我先说说为什么要写直方图均衡化,因为之前接触到理论上的面试,看起来很简单的知识点,其实暗藏着很多的玄机(-_-)。本文尽量尝试着去推导。推导之前写一下基本的原理。

     

    关注公众号,获取更多信息

     

    1、为什么要做直方图均衡化与直方图规定化

    在现实的拍摄过程中,比如说视频监控领域,由于其图像的灰度分布集中在较窄的范围内,这就导致了图像的细节不够清晰。为什么不清晰呢,因为灰度分布较窄时,那么,在计算对比度的时候,对比度就很小,所以就不清晰。为了使得图像变得清晰,那么就需要使得灰度值的差别变大,为了使得灰度值的差别变大,就意味着灰度分布就变的较宽,使得灰度值分布变得均匀,在某个灰度级区间内,像素的个数分布大致相同,这样才能使得图像的对比度增强,细节变得清晰可见。

     

    2、直方图均衡化的原理

     

    直方图均衡化就是对图像进行非线性拉伸,使得变换后的图像直方图分布均匀。那么怎样才能使得新图像的直方图分布均匀呢?

    在介绍直方图均衡化的原理之前,先介绍随机变量的函数分布的数学知识。

     

    2.1、随机变量的函数分布

    2.2.1、连续随机变量的函数分布

    假设连续随机变量的X的概率密度为,求X的函数的概率密度函数
    通用的做法是:
    (1)先求分布函数
    (2)对上面公式两端求导就可以求得概率密度函数
    另外,如果是单调函数,则可以用公式法来求解。
    这里有一个定理:假设随机变量X的概率密度为,设函数g(x)处处可导,且有(或者),则有是连续型随机变量,其概率密度函数为
    式中,,h(y)是g(x)的反函数
     
    证明(只证明的情形):
     
    时,则g(X)在上是严格单调增加的,而且其反函数h(y)也是存在的,且反函数也是单调增加可导的。
     
    因为,的取值范围为
    则当时,
    则当时,
    时,
    对y求导,则
    为什么成立呢,因为相当于把Y=g(X)转换为X=h(Y).
    同理,当时,
     
     

    2.2.2、离散随机变量的函数分布

    设X是离散型随机变量,X的分布律为
    则Y=g(X)的分布律为
    上面表中,当某两个g(xi)相等时,就把概率合并,就是概率相加,然后重新绘制表格。

     

    2.2 直方图均衡化的推导

    直方图均衡化的目的是使得变换后的图像的直方图是均匀分布的,又因为概率密度是指变量落在某个区间的概率,而累积分布函数的导数就是概率密度函数。所以,当分布均匀时,就是使得概率密度能够保持为一个常数。有了这些分析,我们的目的就是想找到这样的一种变换函数,使得变换后图像直方图分布均匀(这里的直方图都用灰度级的个数除以总像素个数,进行归一化。)

    假设r和s分别是变换之前和变换之后的图像灰度级,r和s都进行了归一化的处理。假设变换函数为

    s=T(r),此变换公式满足0≤r≤1,0≤s≤1;当0≤r≤1时,T(r)是单调递增的。

    ,假设r的概率密度为P(r),则s的概率密度可以表示为(根据上面我们介绍的概率密度函数的求解方法):

    (1)

    假设从r到s的变换函数为

      (2)

    式中,明显是r的累积分布函数(也就是

    公式(2)两边对r求导得到

    带入到公式(1)中,得到

    哇,太神奇了,当我们用r的累积分布函数作为变换函数时,得到s的概率密度函数是1(也就是均匀的意思)。

    好了,这里就用连续函数的方式证明了采用原始图像直方图的累积分布来实现直方图均衡化是可行的。

     

    由于我们的图像是离散的,所以,这样怎么求变换后的图像呢,只是把连续的函数离散化就行了。

    (1)先求原始图像的直方图,就是每个灰度级的像素个数除以总像素个数,就是概率密度,

    (2)原始图像灰度级概率密度的累积就是新图像灰度级的概率密度

    k是新图像的灰度级,最大是255,也可以任意设置。

    (3)由于上面求得的s是0到1之间的,然后乘以255或者设置的最大灰度级,就得到新图像的灰度值。

     

    好了,这里就基本上说明了为什么要采用累积分布做直方图均衡化,以及如何做直方图均衡化。

     

    3、直方图规定化

    前面介绍了直方图均衡化,但是这是一种通用的对比度提升方法,如果我们想把图像变换到制定的直方图就显得力不从心。所以就有了直方图规定化,就是对原始图像做变换,使得变换后的图像的直方图跟我们规定的一样。

    假设原始图像的像素值为r,概率密度为P(r);做直方图均衡化之后的灰度值为s,均衡化之后的概率密度为P(s);希望要的图像的概率密度为P(z),再次情况下,求得其像素值z。

    实际上,规定化也是均衡化的一种,那么,就可以把均衡化的结果作为一种中间结果,建立起原始图像与固定化图像的一种桥梁。

    具体步骤如下:

    (1)首先对原始图像做直方图均衡化,得到每个像素s和累积分布T(s);

    (2)根据需要的规定化直方图,求累积分布G(Z);

    (3)显然,如果累积直方图中有0值,那么是不会分配像素值的,因为0乘以255还是零。

    (4)对于每一个T(s)(假设其像素值为ss),找到在G(Z)中与其差值最小的那个G(z)值(假设对应的像素值为zz),那么规定化后就把ss变换为zz。

     

    下面用两个典型的例子来说明,(数据来源于互联网,如有侵权,请告知)

     

     

     

     

    展开全文
  • 直方图均衡化与直方图规定化
    展开全文
  • 首先是opencv在图像处理...老师要求的是在hsv模型里对直方图进行规定化,所以如果你是在rgb模型下进行直方图规定化,只需要将rgb和hsv互相转化的部分删除即可,重点并不是这里。import cv2import numpy as npfrom ...

    首先是opencv在图像处理方面的基础应用,彩色图像的相关知识和技术以及直方图的均衡化和规定化的原理是必须提前掌握,这些我就不做过多的介绍了。 本次实验也是基于python下完成的。

    老师要求的是在hsv模型里对直方图进行规定化,所以如果你是在rgb模型下进行直方图规定化,只需要将rgb和hsv互相转化的部分删除即可,重点并不是这里。

    import cv2

    import numpy as np

    from matplotlib import pyplot as plt

    img1 = cv2.imread('E:\\picSource\\Fig7A.jpg')

    img2 = cv2.imread('E:\\picSource\\Fig7B.jpg')

    img_hsv1 = cv2.cvtColor(img1, cv2.COLOR_BGR2HSV) # bgr转hsv

    img_hsv2 = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)

    color = ('h', 's', 'v')

    for i, col in enumerate(color):

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

    hist1, bins = np.histogram(img_hsv1[:, :, i].ravel(), 256, [0, 256])

    hist2, bins = np.histogram(img_hsv2[:, :, i].ravel(), 256, [0, 256])

    cdf1 = hist1.cumsum() # 灰度值0-255的累计值数组

    cdf2 = hist2.cumsum()

    cdf1_hist = hist1.cumsum() / cdf1.max() # 灰度值的累计值的比率

    cdf2_hist = hist2.cumsum() / cdf2.max()

    diff_cdf = [[0 for j in range(256)] for k in range(256)] # diff_cdf 里是每2个灰度值比率间的差值

    for j in range(256):

    for k in range(256):

    diff_cdf[j][k] = abs(cdf1_hist[j] - cdf2_hist[k])

    lut = [0 for j in range(256)] # 映射表

    for j in range(256):

    min = diff_cdf[j][0]

    index = 0

    for k in range(256): # 直方图规定化的映射原理

    if min > diff_cdf[j][k]:

    min = diff_cdf[j][k]

    index = k

    lut[j] = ([j, index])

    h = int(img_hsv1.shape[0])

    w = int(img_hsv1.shape[1])

    for j in range(h): # 对原图像进行灰度值的映射

    for k in range(w):

    img_hsv1[j, k, i] = lut[img_hsv1[j, k, i]][1]

    hsv_img1 = cv2.cvtColor(img_hsv1, cv2.COLOR_HSV2BGR) # hsv转bgr

    hsv_img2 = cv2.cvtColor(img_hsv2, cv2.COLOR_HSV2BGR)

    cv2.namedWindow('firstpic', 0)

    cv2.resizeWindow('firstpic', 670, 900)

    cv2.namedWindow('targetpic', 0)

    cv2.resizeWindow('targetpic', 670, 900)

    cv2.namedWindow('defpic', 0)

    cv2.resizeWindow('defpic', 670, 900)

    cv2.imshow('firstpic', img1)

    cv2.imshow('targetpic',img2)

    # cv2.imshow('img1', img_hsv1)

    cv2.imshow('defpic', hsv_img1)

    cv2.waitKey(0)

    cv2.destroyAllWindows()

    以下分别是原图像 目标图像 和 经过直方图规定化后的图像:

    展开全文
  • 参考自:数字图像处理第三版,冈萨雷斯图像处理基础(8):图像的灰度直方图、直方图均衡化、直方图规定化(匹配) - Brook_icv - 博客园 https://www.cnblogs.com/wangguchangqing/p/7098213.html直方图规定化,又叫...
  • 图像处理基础(8):图像的灰度直方图、直方图均衡化、直方图规定化(匹配) https://www.cnblogs.com/wangguchangqing/p/7098213.html 本文主要介绍了灰度直方图相关的处理,包括以下几个方面的内容: 利用...
  • 直方图规定化.docx

    2020-04-04 10:47:15
    直方图规定化,不调用现成函数的matlab代码实现。
  • 直方图规定化 1.直方图均衡化 对图像进行非线性拉伸,重新分配图像像元值,使一定灰度范围内像元值的数量大致相等就是直方图的均衡化。原来直方图中间的峰顶部分对比度得到增强,而两侧的谷底部分对比度降低,输出...
  • 灰度直方图 灰度直方图是关于灰度级分布的函数,是对图像中灰度...1、为什么要做直方图均衡化与直方图规定化 在现实的拍摄过程中,比如说视频监控领域,由于其图像的灰度分布集中在较窄的范围内,这就导致了图像...
  • 本文主要介绍了灰度直方图相关的处理,包括以下几个方面的内容:利用OpenCV计算图像的灰度直方图,并绘制直方图曲线直方图均衡化的原理及实现直方图规定化(匹配)的原理及实现图像的灰度直方图一幅图像由不同灰度值的...
  • 直方图匹配又称为直方图规定化,是指将一幅图像的直方图变成规定形状的直方图而进行的图像增强方法。 即将某幅影像或某一区域的直方图匹配到另一幅影像上。使两幅影像的色调保持一致。可以在单波段影像直方图之间...
  • 直方图规定化与均衡化,其中包括源代码还有文档说明
  • 直方图匹配又称为直方图规定化,是指将一幅图像的直方图变成规定形状的直方图而进行的图像增强方法。即将某幅影像或某一区域的直方图匹配到另一幅影像上。将图像的直方图分布规律与待匹配图像的脂肪分布规律近似。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 475
精华内容 190
关键字:

直方图规定化