文章目录

  • 一些说明
    • 关于示例代码
    • 关于依赖环境
    • 关于教材
  • 灰度图、亮度图(Gray Image)
  • 彩色图转灰度图
    • 一般亮度转换(luminosity method)
    • 亮度优先转换(luminosity priority)
    • 平均值转换(average method)
    • 最小亮度转换(minimum luminosity)
    • 最大亮度转换(maximum luminosity)
    • 效果对比
    • 二值化

一些说明

关于示例代码

我的图像算法的全部示例程序,你都可以在 https://github.com/seagochen/AlgorithmsLearning 找到, 目前只上传了一部分,随着这个系列的完成, 我会同步更新还没有上传的部分。

你可以关注我的博客,又或者把相关文章收藏起来,在你比如面试图像方面的岗位时,又或者学习《数字图像处理》课程时,可以把代码都跑一遍。

需要说明一下, 所有示例代码都是Python完成的,避免使用C/C++或者其他语言,是为了最大程度减少语言特性导致的阅读障碍。

关于OpenCV,它的主要的函数C++ 版本和Python是一致的。所以在理解了程序逻辑后,你也可以很容易的用C/C++复现一遍。

至于程序中用到的素材,主要部分来源于冈萨雷斯的《数字图像处理》,其次是一些在Google上搜索到的公开图片,以及我自己制作的一部分,大部分素材你可以从网上很容易找到,由于这些数据体积很大,所以我没有放在仓库中,而且这不影响你使用。

如果出现了侵权,请你联系我,我会在第一时间内删除。

关于依赖环境

运行Python代码, 目前需要一些依赖包:

  • numpy
  • matplotlib
  • opencv-python

Python版本可以使用3.7的版本,至于怎么安装Python,怎么配置IDE,请你自行在网上搜索相关文章,我这里不做累述。

关于教材

推荐买一本冈萨雷斯的《数字图像处理》,这是从事数字图像领域专业的必备教科书,书中写的很详细,我所写的内容对于这位老教授的书来说,最多只能算是补充和摘要。

你也可以配合一些网上已有的视频,我们IT行业的从业人员大多很热衷于技术分享,所以也有不少教授的公开课的录像、个人UP主制作了这些很棒的内容,这些都是非常不错的借鉴和学习资料。

灰度图、亮度图(Gray Image)

在数字图像中,一张图片是不同的像素的组合。如果用矩阵来表示,就是一个二维的数组,或者说矩阵。每一个元素可以是一个包含3个元素的向量 {R,G,B}向量矩阵,或者仅一个元素的 {Gray} 的元素矩阵。


为了更好的研究各类算法,我们常用灰度图作为研究对象。上图中使用的是林肯的照片,如果研究这张照片的原始数据,会发现它其实是这样一个 W×HW \times HW×H 的元素矩阵,每个元素都是一个范围在 [0,255][0, 255][0,255]的整数。

用数学矩阵进行表示的话,大概就是这个样子:

I=[101555145...15101055...11210145...901800125..................]I = \begin{bmatrix} 10 & 15 & 55 & 145 & ... \\ 15 & 10 & 10 & 55 & ... \\ 1 & 12 & 10 & 145 & ... \\ 90 & 180 & 0 & 125 & ... \\ ... & ... & ... &... & ... \end{bmatrix} I=⎣⎢⎢⎢⎢⎡​1015190...​151012180...​5510100...​14555145125...​...............​⎦⎥⎥⎥⎥⎤​

当前主流的图像是8比特位的,所以也解释了为什么大多数PNG、JPG、BMP的格式的图片,图像数据范围都是在 [0,255][0, 255][0,255] 的原因。

彩色图转灰度图

将彩色图片转换为灰度图片(亮度图片),经常是数字图像处理中常用到重要一部,转换方法有多种多样,比如在之前文章里提到的HSV等颜色空间中的转换方法,不过在这里我仅提一些在RGB色域空间中常用到的方法。

尽管以下方法,已经有前人实现了相关函数,并广泛存在于各种图形图像函数库中,但我依然希望你能明白理解这些是怎么计算的。

一般亮度转换(luminosity method)

Gray(x)=0.299⋅R+0.587⋅G+0.114⋅BGray(x) = 0.299 \cdot R + 0.587 \cdot G + 0.114 \cdot BGray(x)=0.299⋅R+0.587⋅G+0.114⋅B

这是一种权重转换,对于每个像素,分别对应其RGB色道上的数据,乘以对应的权重,例如(0.299,0.587,0.114)(0.299, 0.587, 0.114)(0.299,0.587,0.114),这一类权重,通常在G色道上保留较大的权重,而对于R、B色道上保留较小权重。保留较多的G色道,主要因为在G色道上能保有较多的数据,且人眼对于黄、绿、青的光更为敏感。

在人眼可感知的可见光波的 400nm - 700nm这样一个范围里,绿色、黄色、青色处于可见光光带中央,具备最大的颜色覆盖度,也就是最大的亮度覆盖范围,所以无论哪一种权重转换,都需要尽最大可能保留绿色、黄色、青色的占比权重。

因此对于RGB三原色来说,保留最多的绿色,和适量的红色和蓝色,可以近似的模拟出我们对于光通量的感受情况。如果有需要知道更多细节,可以看看这篇文章《为你更新色彩观: 直观理解光谱和颜色》


原图:

这样的实现代码其实很简单:


def rgb_2_gray_normal(rgb_file: str):image = cv2.imread(rgb_file)row, col, channel = image.shapeimage_gray = np.zeros((row, col))for r in range(row):for l in range(col):# convert rgb image to gray image# gray = 0.299⋅R + 0.587⋅G + 0.114⋅Bimage_gray[r, l] =  0.114 * image[r, l, 0] + \0.587 * image[r, l, 1] + \0.299 * image[r, l, 2]print_matrix(image_gray)return image_gray

最终输出效果

亮度优先转换(luminosity priority)

Gray(X)=max(R,G,B)+min(R,G,B)2Gray(X) = \frac{max(R,G,B) + min(R, G, B)}{2}Gray(X)=2max(R,G,B)+min(R,G,B)​

实现代码:


def rgb_2_gray_brightness(rgb_file: str):image = cv2.imread(rgb_file)row, col, channel = image.shapeimage_gray = np.zeros((row, col))for r in range(row):for l in range(col):image_gray[r, l] = 0.5 * max(image[r, l, 0], image[r, l, 1], image[r, l, 2]) +\0.5 * min(image[r, l, 0], image[r, l, 1], image[r, l, 2])print_matrix(image_gray)return image_gray

输出效果

平均值转换(average method)

亮度转换

Gray(X)=R+G+B3Gray(X) = \frac{R + G + B}{3}Gray(X)=3R+G+B​

输出效果:

最小亮度转换(minimum luminosity)

Gray(X)=min(R,G,B)Gray(X) = min(R, G, B)Gray(X)=min(R,G,B)


def rgb_2_gray_min(rgb_file: str):image = cv2.imread(rgb_file)row, col, channel = image.shapeimage_gray = np.zeros((row, col))for r in range(row):for l in range(col):image_gray[r, l] = min(image[r, l, 0], image[r, l, 1], image[r, l, 2])print_matrix(image_gray)return image_gray

输出效果

最大亮度转换(maximum luminosity)

Gray(X)=max(R,G,B)Gray(X) = max(R, G, B)Gray(X)=max(R,G,B)


def rgb_2_gray_max(rgb_file: str):image = cv2.imread(rgb_file)row, col, channel = image.shapeimage_gray = np.zeros((row, col))for r in range(row):for l in range(col):image_gray[r, l] = max(image[r, l, 0], image[r, l, 1], image[r, l, 2])print_matrix(image_gray)return image_gray

输出效果

效果对比

我们把输出效果进行对比:


相对的来说,采用权重法表现要更柔和一些,当然使用哪一种方法,纯粹依据具体情况来定。例如对于原图本身亮度欠佳的,采用最大亮度的方式会更合适,但对于本来已经光污染的图片来说,也许用最小亮度会更合适一些。

除了这些线性的方式,也有一些采用二次采样曲线的转换方法,以及转换颜色空间到HSV,以纯粹亮度进行输出的方法,这里就不做更多的赘述了。有兴趣的朋友可以自行查找相关资料,做做实验看一看。

二值化

除了灰度图以外,还有另外一类只有黑白的所谓二值化的颜色转换方法。“二值化”,也被称为黑白图像,它的颜色状态只有黑和白两种。也是一种比较常见的图像。它之所以能够存在,其一是压缩后的数据体量更小,便于网络传输,其二是在一些传统的新闻出版行业,可以节省印刷成本。当然,缺点也是有的,就是图片经过二值化后,会丢失很多细节。

比如这样的一个函数,可以当作二值化的处理函数:

Black(Y)={255X>900otherwiseBlack(Y) = \left\{\begin{matrix} 255 & X > 90 \\ 0 & otherwise \end{matrix}\right. Black(Y)={2550​X>90otherwise​

这里的X表示的是阈值,你可以简单的给定一个常数,比如100,也可以配合灰度直方图,动态的进行调整,以达到最大化保存图片细节的目的。

当然我们也可以使用比如图像抖动的方法,为二值化图像增加足够多的细节,不过这些内容会在我后面的文章里提到,这里就不做过多的补充了。

简单的代码实现方法:


def rgb_2_black(rgb_file: str):image = cv2.imread(rgb_file)row, col, channel = image.shapeimage_gray = np.zeros((row, col))for r in range(row):for l in range(col):# first of all, convert rgb image to grayX = 0.114 * image[r, l, 0] + 0.587 * image[r, l, 1] + 0.299 * image[r, l, 2]if X > 90:image_gray[r, l] = 255else:image_gray[r, l] = 0print_matrix(image_gray)return image_gray

输出效果

[参考资料]

  • 《彩色图像怎样转灰度图像》,saltriver,https://blog.csdn.net/saltriver/article/details/79677116

数字图像学笔记——3.彩色转黑白相关推荐

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

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

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

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

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

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

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

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

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

    文章目录 灰度直方图(Gray Histogram) 直方图的计算方法 简单的图像转换方法 线性变换 / 图像翻转(Image Nagatives) 对数变换(Log Transformation) ...

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

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

  7. 数字图像处理与Python实现笔记之彩色图像处理初步

    数字图像处理与Python实现笔记之彩色图像处理初步 摘要 绪论 1 数字图像处理基础知识 2 彩色图像处理初步 2.1 彩色图像的颜色空间 2.1.1 RGB颜色空间 2.1.2 HSI颜色空间 2 ...

  8. 沈逸老师ubuntu速学笔记(2)-- ubuntu16.04下 apache2.4和php7结合编译安装,并安裝PDOmysql扩展...

    1.编译安装apache2.4.20 1 第一步: ./configure --prefix=/usr/local/httpd --enable-so 2 第二步: make 3 第三步: sudo ...

  9. 数字图像识别学习笔记(第二章-数字图像基础(1))

    title: 数字图像识别学习笔记(第二章 数字图像基础(1)) categories: 数字图像识别 tags: 数字图像识别 date: 2020/9/30 21:22 mathjax: true ...

最新文章

  1. 安全隐患:神经网络可以隐藏恶意软件
  2. 解决grub引导错误的问题
  3. 绘制颜色渐变矩形函数
  4. c语言按shift用户随时退出,2014年云南省“三校生”高考计算机第三次模拟试卷...
  5. 02_Storm集群部署
  6. Mac下配置ndk/adb
  7. 最大数组全局还是局部的问题
  8. 【渝粤题库】陕西师范大学800000 地图学原理
  9. 【BZOJ1823】 [JSOI2010]满汉全席
  10. Excel怎么删除表格最后的空行
  11. cwrsync向linux免密同步,Cwrsync如何使用可以实现Linux与windows下的文件同步详解
  12. 面试题之细胞分裂问题
  13. Push failed Remote: Support for password authentication was removed on August 13, 2021.
  14. 题解1205汉诺塔问题
  15. Ceph 故障排查笔记 | 万字经验总结
  16. 2018总结-店铺投资篇
  17. 你真的会搜索资源吗?我来把我的资源搜索心得告诉你...
  18. 从后端数据库获取数据并传值到前端vue项目的echarts柱状图/折线图/饼图里
  19. python中的TypeError错误解决办法
  20. HTML+CSS+JS的基础知识笔记

热门文章

  1. OpenNI:深度图显示方法
  2. 有道云笔记 - Markdown模板(文首附markdown源码,即.md文件)
  3. 我的域名注册踩坑指南
  4. Mac安装Mysql卡在最后一步
  5. Delphi XE6 原生解析json
  6. 虚拟化中的链接克隆技术
  7. 互联网 IT 精英:龙泉寺静心之旅 1
  8. Android之MySql数据库操作
  9. apple id 已被停用?我的解决之道
  10. 对于硬件成品测试,可以设计哪些测试用例?