Histogram Processing
Gonzalez R. C. and Woods R. E. Digital Image Processing (Forth Edition).
令\(r_k, k = 0, 1,2, \cdots, L-1\) 表示图片密度值为\(k\),
\]
整个图片\(f(x, y)\)中密度值为\(r_k\)的pixel的数量, 定义概率
\]
其中\(M, N\)分别表示图片的高和宽(注意, 如果是多通道的图, 则应该\(CMN\)). 下图即为例子, 统计了\(r_k\)的分布.

HISTOGRAM EQUALIZATION
上面的四幅图, \(r_k\)呈现了不同的分布, 其中第四幅图, 拥有最佳的对比度, 可以发现其\(r_k\)的分布近似一个均匀分布, histogram equalization就是这样一种方法, 寻找一个变换
\]
使得\(s\)的分布近似满足一个均匀分布.
当然了, 这种分布显然不能破坏图片结构, 需要满足以下条件:
- \(T(r)\)在\(0\le r \le L-1\)熵是一个单调函数;
- \(0 \le T(r) \le L-1, \quad \forall 0 \le r \le L-1\).
我们首先把\(r\)看成连续的, 且假设\(p_r(r)\)是一个连续的密度函数, 则定义
\]
显然\(\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]\)), 故
\]
即严格来说, 如果考虑连续的情况, 那么这种变换\(T\)一定能够得到我们所希望的最佳对比度.
将上述过程转换为离散的情况, 即
\]
为什么这种情况不能保证\(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 \rightarrow z\):
\]
\(T(r) = s =G(z)\), 既然在连续的情况下\(s\)是均匀的, 故
\]
当然需要一个额外的假设\(G\)是可逆的. 如此, 我们变把\(r\)转换成了我们期待的分布\(z\).
那么在离散的情况下, 处理流程如下:
通过
\[T(r_k), \: k = 0, 1, \cdots, L-1,
\]建立字典
\[d_{rs}=\{r_k:\mathrm{round}(T(r_k))\}.
\]通过
\]
对于每一个\(s_k\), 从\(z_j, j=0,1,\cdots, L-1\)中找到一个\(z_j\)使得\(G(z_j)\)与\(s_k\)最接近, 并建立字典
\]
- \(r \rightarrow z\):
\]
在实际中, 一般取原图\(r\)分布一个光滑近似, 如下图所示(个人觉得, 此处核密度函数估计大有可为):

其它
有些时候, 我们只需要对一部分的区域进行上述的处理, 就是LOCAL HISTOGRAM PROCESSING.
另外, 可以用一些统计信息来处理, 比如常见的矩
m = \sum_{i=0}^{L-1}r_i p(r_i),
\]
这里\(m\)是均值. 常用的二阶矩, 方差:
\]
是图片对比度的一种衡量的手段.
对于以\((x, y)\)为中心的区域, 也可以各自定义其矩\(\mu_{S_{xy}}\). 下图就是通过区域的一阶矩和二阶矩的信息来让黑色部分的对比度增加.

Histogram Processing的更多相关文章
- 数字图像处理实验(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 ...
- 【Duke-Image】Week_3 Spatial processing
Chapter_3 Intensity Transsformations and Spatial Filtering 灰度变换与空间滤波 Intensity transformation functi ...
- 数字图像处理实验(总计23个)汇总 标签: 图像处理MATLAB 2017-05-31 10:30 175人阅读 评论(0)
以下这些实验中的代码全部是我自己编写调试通过的,到此,最后进行一下汇总. 数字图像处理实验(1):PROJECT 02-01, Image Printing Program Based on Half ...
- [OpenCV] Image Processing - Grayscale Transform & Histogram
颜色直方图 首先,先介绍一些Hist的基本使用. Ref:[OpenCV]数字图像灰度直方图 官方文档:https://docs.opencv.org/trunk/d8/dbc/tutorial_hi ...
- Digital Image Processing 学习笔记3
第三章 灰度变换与空间滤波 3.1 背景知识 3.1.1 灰度变换和空间滤波基础 本章节所讨论的图像处理技术都是在空间域进行的.可以表示为下式: $$g(x, y) = T[f(x,y)]$$ 其中$ ...
- 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 ...
- CUDA Samples: Calculate Histogram(atomicAdd)
以下CUDA sample是分别用C++和CUDA实现的计算一维直方图,并对其中使用到的CUDA函数进行了解说,code参考了<GPU高性能编程CUDA实战>一书的第九章,各个文件内容如下 ...
- Video processing systems and methods
BACKGROUND The present invention relates to video processing systems. Advances in imaging technology ...
- Image Processing and Analysis_15_Image Registration:HAIRIS: A Method for Automatic Image Registration Through Histogram-Based Image Segmentation——2011
此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...
随机推荐
- 设计和实现OLAP解决方案 [转]
第一讲 简介首先,啥叫数据仓库? 数据仓库就是数据的仓库!用外文说叫Data Warehouse,简称DW. 是不是哐当倒下一片啊,要不咱换个专业点的说法? 数据仓库是一个面向主题的.集成的.相对稳定 ...
- C++之error: cannot bind non-const lvalue reference of type ‘myString&’ to an rvalue of type ‘myString’
先看代码(不想看代码可以直接看代码后的问题描述) //header.h #ifndef _HEADER_H #define _HEADER_H #define defaultSize 128 #inc ...
- Android WifiP2p实现
Android WifiP2p实现 Wifi Direct功能早在Android 4.0就以经加入Android系统了,但是一直没有很好的被支持,主要原因是比较耗电而且连接并不是很稳定.但是也有很大的 ...
- Java对象的创建过程:类的初始化与实例化
一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...
- 【Java基础】ArrayList初始化操作
要用60个零初始化列表,请执行以下操作: List<Integer> list = new ArrayList<Integer>(Collections.nCopies(60, ...
- Maven配置大全
maven项目打jar包(带依赖) <build> <plugins> <plugin> <artifactId>maven-assembly-plug ...
- 莫烦python教程学习笔记——validation_curve用于调参
# View more python learning tutorial on my Youtube and Youku channel!!! # Youtube video tutorial: ht ...
- 什么是token?
一.简介 token的意思是"令牌",是服务端生成的一串字符串,作为客户端进行请求的一个标识. 当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端 ...
- jenkins pipeline语法
目录 一.声明式 二.脚本式 基本 判断 异常处理 Steps node withEnv 一.声明式 声明式Pipeline必须包含在名为pipeline的语句块中,典型的声明式Pipeline语法如 ...
- Docker从入门到精通(五)——Dockerfile
Dockerfile 简单来说就是一个包含用于组合镜像的命令的文本文档,Docker 通过读取 Dockerfile 中的指令就可以按步骤生成镜像,那么在制作镜像之前,我们先了解一下镜像的原理. 1. ...