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. OpenStack——云平台部署

    一.配置网络 准备:安装两台最小化的CentOS7.2的虚拟机,分别添加两张网卡,分别为仅主机模式和NAT模式,并且计算节点设置为4G运行内存,50G硬盘 1.控制节点--配置网络 控制节点第一个网卡 ...

  2. 学习java 6.30

    学习内容:Java的运算符与C中类似,虽是类似,还是有点区别,在这里详细说明一下,即字符以及字符串的+操作,字符的+操作执行后需要赋值给表达式中数据范围最大的类型, 字符串的+操作,当+中有字符串,则 ...

  3. 用oracle中的Row_Number实现分页

    Row_Number实现分页   1:首先是 select ROW_NUMBER() over(order by id asc) as 'rowNumber', * from table1 生成带序号 ...

  4. 图书管理系统总结——数据库操纵(二):DML语句

    这里以最基本的DML语句作为例子,其他各种复杂的DML语句可以根据这些基本JDBC语句得到. 一.查询表格 这里以两张表关联查询为例,采用动态方式,根据输入的条件在WHERE语句后面接上相应的各种条件 ...

  5. MFC入门示例之访问对话框控件的7种方法

    方法一: 1 //方法一 2 void CMFCApplication2Dlg::OnBnClickedButton1() 3 { 4 int num1, num2, num3; 5 TCHAR ch ...

  6. synchronized底层浅析(二)

    一张图了解锁升级流程:

  7. 车载以太网第二弹|测试之实锤-1000BASE-T1 IOP测试实践

    背景 车载以太网通信技术在汽车行业的应用速度远超预期,去年本土OEM已经上市了应用100BASE -T1的车型.今年,应用1000BASE -T1的车型预计也将会量产上市.针对测试而言,带来另外一个难 ...

  8. [OpenGL ES 02]OpenGL ES渲染管线与着色器

    [OpenGL ES 02]OpenGL ES渲染管线与着色器 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循"署名-非商业用途-保持一致"创 ...

  9. [BUUCTF]REVERSE——[GXYCTF2019]luck_guy

    [GXYCTF2019]luck_guy 附件 步骤: ida载入,shift+f12查看程序里的字符串,看到了关于flag的提示 双击跟进跳转,ctrl+x找到关键函数 flag是由f1和f1拼接而 ...

  10. win10 linux ubuntu子系统 使用adb

    条件 本文已经默认你已经在win10系统下成功配置了ubuntu子系统,所以唯一的条件就是windows上的adb 版本和ubuntu子系统的adb版本一致. 方法 怎么来保证adb 版本一致呢?在本 ...