文章目录

  • 灰度直方图(Gray Histogram)
  • 直方图的计算方法
  • 简单的图像转换方法
    • 线性变换 / 图像翻转(Image Nagatives)
    • 对数变换(Log Transformation)
    • Gamma变换(Power-Law Transformation)

灰度直方图(Gray Histogram)

在数字图像处理中,灰度直方图是一种计算代价非常小但却很有用的工具,它概括了一幅图像的灰度级信息,它用来描述每个灰度级在图像矩阵中的像素个数或者占有率,或者出现频率。

通过直方图,我们可以很快知道一个灰度图片中有效数据的大概范围,可以通过一些简单的线性计算,将我们感兴趣的数据重新编辑到新的图片中,也可以调节一张照片的曝光量,某些教科书上称这种做法叫对比度进行调节。

当然,如果配合神经元网络,我们也可以对一些黑白照片重新上色。当然这些都是比较高阶的技巧了。

直方图调整有几种常用的方法,如线性变换、分段线性变换、伽马变换、直方图正规化、直方图均衡化、局部自适应直方图均衡化、图像翻转等,这些方法的计算代价较小,但是却产生了较为理想的效果。

直方图的计算方法


我又把这张图拿了出来,直方图的计算方式,其实就是从上到下,从左到右一个一个像素进行统计。所以假设我们对林肯的照片进行分析,绘制这张照片的直方图,那么在X轴的方向,就是强度信息,也就是灰度值 [0,255][0, 255][0,255],而它的Y轴方向,就是频率信息,或者说是各像素点值的出现率。

def calculate_hist(img):# create a matrix to hold histogram informationhistogram = np.zeros(256, dtype=np.uint64)# iterate each pixelrow, col = img.shapefor r in range(row):for c in range(col):histogram[img[r, c]] = histogram[img[r, c]] + 1# return to callerreturn histogram

我们对结果进行比对,看看是否一致:

    # load data from fileimg = cv2.imread("Data/lincoln.jpg", cv2.IMREAD_GRAYSCALE)my_hist = calculate_hist(img)# showshow_images(img.reshape(-1), my_hist)

输出的效果:


左侧是我们的计算结果,而右侧是通过matplotlib进行统计的结果,我们可以看到结果是一样的。通过直方图,我们知道我们感兴趣的数据,主要集中在[0,100][0, 100][0,100]和[160,255][160, 255][160,255]这两个范围区间内,那么这两个区间内都包含哪些有趣的图像信息呢?

简单的图像转换方法

线性变换 / 图像翻转(Image Nagatives)

线性变换,又或者叫图像翻转,通常被应用于X光照片这类图像的处理。由于我们兴趣区域的数据多处于低密度区域,而这部分数据如果直接显示通常较难观察到(low intensity),例如X光来说,低密度的细节通常很难进行观察,而通过线性转换,则可以得到一些用肉眼不太容易注意到的细节。


比如这张对乳腺的X光照片,转换后的右侧图片中黑色斑块的位置,可能预示患者已经有了肿块,可能需要进一步的细致检查。

假设图像的灰阶为[0,255][0, 255][0,255]这个范围,那么它的线性转换计算方式可以简单的表示为:

Ic=255−IoI_c = 255 - I_o Ic​=255−Io​

其中IcI_cIc​表示为转换后的图像灰阶,IoI_oIo​表示为原始图像灰阶。在冈萨雷斯的教材上,这个公式表示为:s=L−1−rs = L - 1 - rs=L−1−r,本质上是一样的。算法代码如果使用到 numpy 的独有特性,那么可以更简单的写成这样:

def image_negative(file: str):image = cv2.imread(file, cv2.IMREAD_GRAYSCALE)negative_img = 255 - image.flatten()negative_img = negative_img.reshape(image.shape)show_images(image, negative_img, "Negative Image")

对数变换(Log Transformation)

由于线性变化,正如其名字线性的,所以如果很多重要的数据都挤压在低密度数据区间时,直接进行线性变化也很难看出图像的特征,那么就通过对数的方式,不成比例的“放大”图像的细节。

Ic=c⋅log(1+Io)I_c = c \cdot log(1 + I_o) Ic​=c⋅log(1+Io​)

其中 ccc 是曲线放大系数,(1+Io)(1+I_o)(1+Io​) 的目的是把 log 曲线向左移1个单位。

放大系数并无固定要求,通常根据自己实际工作的需要来调试确定。

def log_transform(file: str):image = cv2.imread(file, cv2.IMREAD_GRAYSCALE)log_trans = 10 * np.log(1 + image)log_trans = np.uint8(log_trans)show_images(image, log_trans, "Log Transform")

Gamma变换(Power-Law Transformation)

Gamma函数实际上就是幂函数,其公式为:
Ic=c⋅IoγI_c = c \cdot I{_o}^\gamma Ic​=c⋅Io​γ
不同的gamma值,会输出不同的映射曲线,由于我们通常只使用其第一象限内的映射,且把[0,255][0,255][0,255]的灰阶强度,归一化后控制在[0,1][0,1][0,1]这个区间


所以实际上的转换效果是这样:


通过gamma变换,可以有效的纠正一张过曝或欠光的图片。从图中的曲线可以得知,如果要将一张欠光的照片调整到正常的样子,可以让 γ<1\gamma < 1γ<1。而对于一张过曝的照片,则可以让γ>1\gamma > 1γ>1,从而获得满意的效果。

ccc 通常为放大、缩小倍数,一般情况下,我们令其为1。

对于欠光的图片:

而对于过曝照片:


def gamma_transform(file: str, c, gamma):image = cv2.imread(file, cv2.IMREAD_GRAYSCALE)# # normalization the pixelsfloat_image = image / 255.0gamma_trans = c * np.power(float_image, gamma)gamma_trans = np.uint8(gamma_trans  * 255.0)show_images(image, gamma_trans , "Gamma Transform")

数字图像学笔记——4. 直方图计算、线性变换、对数变换、Gamma变换相关推荐

  1. 数字图像学笔记——13. 图像退化与复原(退化函数的评估方法:观察法、实验法、数学建模法与湍流导致的退化)

    在对受到多种原因影响的图像进行复原时,我们经常需要先行评估对图像质量产生影响的退化函数,有时甚至需要尝试建模.通过这些手段,能够最大程度上恢复图像上的噪音,并重建高清的图像细节. 文章目录 线性位置不 ...

  2. 数字图像学笔记 —— 16. 图像退化与复原(自适应滤波之「最小均方差滤波」)

    文章目录 图像恢复的一般运算过程 什么是「最小均方差滤波」 实现步骤 实现代码 最后的结果 图像恢复的一般运算过程 我们从前几章的基本理论出发,退化信号恢复成原始信号的步骤,可以概括成两步基本公式.对 ...

  3. 数字图像学笔记——14. 图像退化与复原(线性退化)

    文章目录 运动导致的退化(线性退化) 水平运动导致的退化 垂直运动导致的退化 运动导致的退化(线性退化) 在上一章 <数字图像学笔记--13. 图像退化与复原(退化函数的评估方法:观察法.实验法 ...

  4. 数字图像学笔记——10. 频域与傅里叶分析方法

    频域滤波技术,目前主要使用的有两种类型,一种是傅立叶变换技术,还有一种是小波分析.基本逻辑就是把原始信号映射到频率空间中,使得在时域空间无法处理的信号,得以在另外一种空间体系下能够被较有效的处理. 目 ...

  5. 数字图像学笔记——3.彩色转黑白

    文章目录 一些说明 关于示例代码 关于依赖环境 关于教材 灰度图.亮度图(Gray Image) 彩色图转灰度图 一般亮度转换(luminosity method) 亮度优先转换(luminosity ...

  6. 数字图像学笔记——7. 噪音生成(泊松噪音生成方法)

    文章目录 泊松噪音 Knuth算法 散列生成算法 生成泊松噪音的图像 泊松噪音 Knuth算法 首先,回顾泊松分布的函数: P(x=k)=e−λλkk!P(x=k) = \frac{e^{- \lam ...

  7. 《OpenCV3编程入门》学习笔记9 直方图与匹配(一二) 图像直方图概述直方图的计算与绘制

    第9章 直方图与匹配 9.1 图像直方图(Histogram)概述 1.作用:   在每个兴趣点设置一个有相近特征的直方图所构成的标签,通过标记帧与帧之间显著的边缘.颜色.角度等特征的统计变化,来检测 ...

  8. Python OpenCV学习笔记之:灰度图像的直方图计算

    为什么80%的码农都做不了架构师?>>>    # -*- coding: utf-8 -*- """ 图像的直方图计算 ""&qu ...

  9. 【opencv学习笔记】025之直方图计算 - calcHist函数详解

    前言 如果你想了解更多有关于计算机视觉.OpenCV.机器学习.深度学习等相关技术的内容,想与更多大佬一起沟通,那就扫描下方二维码加入我们吧! 1.calcHist函数是干什么滴? 这个问题嘛,看看标 ...

最新文章

  1. 《Ext JS权威指南》节选:在Visual Studio中实现Ext JS智能提示
  2. python数据类型转换方法列表
  3. python3之日期和时间(转载)
  4. 说说“开源杀死商业开发工具”
  5. d3.js 搭建 d3-force-directed-graph 例子
  6. 【JUC】第六章 Fork/Join 框架、CompletableFuture
  7. Soft NMS算法笔记
  8. EF架构~将数据库注释添加导入到模型实体类中
  9. 精选 | 2017年11月R新包推荐
  10. PC端后台管理系统实现
  11. oracle sqlplus
  12. FastFDS分布式文件系统
  13. 纯CSS制作-旋转立方体效果
  14. win10桌面右键一直转圈_吐血推荐:掌握这些技巧,win10工作效率提升9999%
  15. 在 100% 鲜活的时间,请让我遇见你
  16. [Java学习笔记]-数组
  17. powder-puff 花拳绣腿
  18. C# 委托、匿名委托、Lambda表达式详解
  19. 速看|快速软件开发框架突破信息孤岛,高效实现数字化发展!
  20. 图像审核产品“侦图” —— Milvus 在翼支付风控场景中的应用

热门文章

  1. w ndows热键,Windows8 鼠标键盘快捷键热键技巧汇总
  2. 体检导检排队系统智能导检
  3. org.xml.sax.SAXParseException: The markup in the document following the root element must be well-fo
  4. matlab2021b软件下载+crack
  5. 2021 第二届天翼杯ctf
  6. Linux配置网络信息(四种方法)
  7. gstreamer学习笔记---v4l2src
  8. 携程的技术氛围怎么样?
  9. 单机启动schedule报错:Get http://127.0.0.1:10251/healthz: dial tcp 127.0.0.1:10251: connect: connection ref
  10. JAVA导出Excel通用工具类——第一篇:详细介绍POI 导出excel的多种复杂情况,包括动态设置筛选、动态合并横向(纵向)单元格等多种复杂情况——保姆级别,真的不能再详细了,代码拿来即用)