Gonzalez R. C. and Woods R. E. Digital Image Processing (Forth Edition).

令\(r_k, k = 0, 1,2, \cdots, L-1\) 表示图片密度值为\(k\),

\[h(r_k) = n_k, \: k = 0, 1, \cdots, L-1,
\]

整个图片\(f(x, y)\)中密度值为\(r_k\)的pixel的数量, 定义概率

\[p(r_k) = \frac{h(r_k)}{MN} = \frac{n_k}{MN},
\]

其中\(M, N\)分别表示图片的高和宽(注意, 如果是多通道的图, 则应该\(CMN\)). 下图即为例子, 统计了\(r_k\)的分布.

HISTOGRAM EQUALIZATION

上面的四幅图, \(r_k\)呈现了不同的分布, 其中第四幅图, 拥有最佳的对比度, 可以发现其\(r_k\)的分布近似一个均匀分布, histogram equalization就是这样一种方法, 寻找一个变换

\[s = T(r), \quad 0 \le r \le L-1,
\]

使得\(s\)的分布近似满足一个均匀分布.

当然了, 这种分布显然不能破坏图片结构, 需要满足以下条件:

  1. \(T(r)\)在\(0\le r \le L-1\)熵是一个单调函数;
  2. \(0 \le T(r) \le L-1, \quad \forall 0 \le r \le L-1\).

我们首先把\(r\)看成连续的, 且假设\(p_r(r)\)是一个连续的密度函数, 则定义

\[s = T(r) = (L-1) \int_0^r p_r(w) \mathrm{d} w.
\]

显然\(\int_0^r p_r(w) \mathrm{d}w\)单调, 故\(T(r)\)也是单调的, 又\(0\le \int_0^r p_r(w) \mathrm{d}w \le 1\), 故第二个条件也是满足的.

既然\(u = \int_0^r p_r(w) \mathrm{d}w\)是满足均匀分布的随机变量(\([0, 1]\)), 故

\[s \sim U[0, L-1].
\]

即严格来说, 如果考虑连续的情况, 那么这种变换\(T\)一定能够得到我们所希望的最佳对比度.

将上述过程转换为离散的情况, 即

\[s_k = T(r_k) = (L - 1) \sum_{j=0}^k p_r (r_j), \: k=0,1,\cdots, L-1.
\]

为什么这种情况不能保证\(s_k\)满足均匀分布, 因为\(s_k\)可能是小数, 在图片中需要经过四舍五入操作, 就导致了不平衡.

代码示例

import cv2
import matplotlib.pyplot as plt
import numpy as np
# 加载图片
pollen = cv2.imread("./pics/pollen.png")
pollen.shape # (377, 376, 3) 由于是截的图, 所以是3通道的
pollen = cv2.cvtColor(pollen, cv2.COLOR_BGR2GRAY) # 先转成灰度图
pollen.shape # (377, 376)
plt.imshow(pollen, cmap='gray')

# 来看一下r的分布
hist = cv2.calcHist([pollen], [0], None, [256], (0, 255)).squeeze()
plt.bar(x=np.arange(256), height=hist)

# 自己的实现 img 是灰度图, 且 0, 1, ..., 255
def equalizeHist(img):
m, n = img.shape
hist = cv2.calcHist([img], [0], None, [256], (0, 255)).squeeze() / (m * n)
links = dict()
cum_sum = 0
for r in range(256):
cum_sum += hist[r]
links[r] = round(cum_sum * 255)
img2 = img.copy()
for i in range(m):
for j in range(n):
r = img[i, j].item()
img2[i, j] = links[r]
return np.array(img2)
pollen2 = equalizeHist(pollen)
plt.imshow(pollen2, cmap='gray')

hist = cv2.calcHist([pollen2], [0], None, [256], (0, 255)).squeeze()
plt.bar(x=np.arange(256), height=hist)

# cv2 官方实现
pollen3 = cv2.equalizeHist(pollen)
plt.imshow(pollen3, cmap='gray')

hist = cv2.calcHist([pollen3], [0], None, [256], (0, 255)).squeeze()
plt.bar(x=np.arange(256), height=hist)

HISTOGRAM MATCHING (SPECIFICATION)

正如上面所说的, equalize只在连续的情况下是能够保证转换后的分布是均匀的, 当离散的时候, 实际上, 当分布特别聚集的时候, 出现的分布会与均匀相差甚远. 如下面的月球的表面图, 由于其分布集中在0附近, 导致变换后的图形并不能够很好的增加对比度(虽然能看清点).

此时, 我们可以预先指定一个分布\(p_z\), 回顾:

\[s = T(r) = (L-1) \int_0^r p_r (w) \mathrm{d} w,
\]

我们将\(s \rightarrow z\):

\[s = G(z) = (L-1) \int_0^z p_z (v) \mathrm{d} v,
\]

\(T(r) = s =G(z)\), 既然在连续的情况下\(s\)是均匀的, 故

\[z = G^{-1} T(r),
\]

当然需要一个额外的假设\(G\)是可逆的. 如此, 我们变把\(r\)转换成了我们期待的分布\(z\).

那么在离散的情况下, 处理流程如下:

  1. 通过

    \[T(r_k), \: k = 0, 1, \cdots, L-1,
    \]

    建立字典

    \[d_{rs}=\{r_k:\mathrm{round}(T(r_k))\}.
    \]
  2. 通过

\[G(z_k), \: k = 0, 1, \cdots, L-1,
\]

对于每一个\(s_k\), 从\(z_j, j=0,1,\cdots, L-1\)中找到一个\(z_j\)使得\(G(z_j)\)与\(s_k\)最接近, 并建立字典

\[d_{sz} = \{s_k:z_j\}.
\]
  1. \(r \rightarrow z\):
\[z = d_{sz}[d_{rs}[r]].
\]

在实际中, 一般取原图\(r\)分布一个光滑近似, 如下图所示(个人觉得, 此处核密度函数估计大有可为):

其它

有些时候, 我们只需要对一部分的区域进行上述的处理, 就是LOCAL HISTOGRAM PROCESSING.

另外, 可以用一些统计信息来处理, 比如常见的矩

\[\mu_n = \sum_{i=0}^{L-1} (r_i-m)^n p(r_i), \\
m = \sum_{i=0}^{L-1}r_i p(r_i),
\]

这里\(m\)是均值. 常用的二阶矩, 方差:

\[\sigma^2 = \sum_{i=0}^{L-1} (r_i - m)^2 p(r_i),
\]

是图片对比度的一种衡量的手段.

对于以\((x, y)\)为中心的区域, 也可以各自定义其矩\(\mu_{S_{xy}}\). 下图就是通过区域的一阶矩和二阶矩的信息来让黑色部分的对比度增加.

Histogram Processing的更多相关文章

  1. 数字图像处理实验(16):PROJECT 06-03,Color Image Enhancement by Histogram Processing 标签: 图像处理MATLAB 2017

    实验要求: Objective: To know how to implement image enhancement for color images by histogram processing ...

  2. 【Duke-Image】Week_3 Spatial processing

    Chapter_3 Intensity Transsformations and Spatial Filtering 灰度变换与空间滤波 Intensity transformation functi ...

  3. 数字图像处理实验(总计23个)汇总 标签: 图像处理MATLAB 2017-05-31 10:30 175人阅读 评论(0)

    以下这些实验中的代码全部是我自己编写调试通过的,到此,最后进行一下汇总. 数字图像处理实验(1):PROJECT 02-01, Image Printing Program Based on Half ...

  4. [OpenCV] Image Processing - Grayscale Transform & Histogram

    颜色直方图 首先,先介绍一些Hist的基本使用. Ref:[OpenCV]数字图像灰度直方图 官方文档:https://docs.opencv.org/trunk/d8/dbc/tutorial_hi ...

  5. Digital Image Processing 学习笔记3

    第三章 灰度变换与空间滤波 3.1 背景知识 3.1.1 灰度变换和空间滤波基础 本章节所讨论的图像处理技术都是在空间域进行的.可以表示为下式: $$g(x, y) = T[f(x,y)]$$ 其中$ ...

  6. Linux command line exercises for NGS data processing

    by Umer Zeeshan Ijaz The purpose of this tutorial is to introduce students to the frequently used to ...

  7. CUDA Samples: Calculate Histogram(atomicAdd)

    以下CUDA sample是分别用C++和CUDA实现的计算一维直方图,并对其中使用到的CUDA函数进行了解说,code参考了<GPU高性能编程CUDA实战>一书的第九章,各个文件内容如下 ...

  8. Video processing systems and methods

    BACKGROUND The present invention relates to video processing systems. Advances in imaging technology ...

  9. Image Processing and Analysis_15_Image Registration:HAIRIS: A Method for Automatic Image Registration Through Histogram-Based Image Segmentation——2011

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

随机推荐

  1. A Child's History of England.5

    Above all, it was in the Roman time, and by means of Roman ships, that the Christian Religion was fi ...

  2. 【STM8】添加头文件、加入库函数

    下面顺便放上STM8L15x-16x-05x的固件库,以及固件库里没有的<stm8l15x_conf.h> 链接打开后,还会发现另外两个文件夹,<src><inc> ...

  3. Dubbo消费者异步调用Future使用

    Dubbo的四大组件工作原理图,其中消费者调用提供者采用的是同步调用方式.消费者对于提供者的调用,也可以采用异步方式进行调用.异步调用一般应用于提供者提供的是耗时性IO服务 一.Future异步执行原 ...

  4. pandas读取csv文件中文乱码问题

    1.为什么会出现乱码问题,用什么方式编码就用什么方式解码,由于csv不是用的utf-8编码,故不能用它解码. 常用的编码方式有 utf-8,ISO-8859-1.GB18030等. 2.中文乱码原因: ...

  5. Java基础语法与流程控制

    Java基础语法与流程控制 跟着狂神学Java的第二天O(∩_∩)O~,养成一个总结的习惯 志同道合的小伙伴可以一起学习狂神的视频 本节地址:https://www.kuangstudy.com/co ...

  6. Lock 锁的实现

    锁的种类 自旋锁(spinlock):无法获得锁,就一直循环获取,适合短时间的加锁 睡眠锁(sleeplock):为了防止长时间的循环等待,在获取不到锁时,进程陷入睡眠,当锁释放时对睡眠进程进行唤醒 ...

  7. JavaOOP对象和封装

    对象: 前言: 在程序员眼中,世界万物皆为对象.世界上有两种人,一种是懂二进制的人,一种就是不懂二进制的人. 面向对象设计的过程就是抽象的过程. 步骤: 第一步:发现类 第二步:发现类的属性 第三步: ...

  8. 日历优先级(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 好了,这下我们一共有三个日历了:"项目日历"(默认的日历)."任务日历"(与任务关 ...

  9. CF1092B Teams Forming 题解

    Content 有 \(n\) 个学生,每个学生有一个能力值 \(a_i\).现在想把学生两两分成一组,但是不能让每个组里面的学生能力值不相同,因此可以通过刷题来提升自己的能力值,每次解出一道题,能力 ...

  10. CF1003C Intense Heat 题解

    Content 给定一个长度为 \(n\) 的数列,求数列中所有长度 \(\geqslant k\) 的区间的最大平均值. 数据范围:\(1\leqslant k,n,a_i\leqslant 500 ...