[Python从零到壹] 五十一.图像增强及运算篇之图像灰度直方图对比分析万字详解
Posted Eastmount
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Python从零到壹] 五十一.图像增强及运算篇之图像灰度直方图对比分析万字详解相关的知识,希望对你有一定的参考价值。
欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。
该系列文章主要讲解Python OpenCV图像处理和图像识别知识,前期主要讲解图像处理基础知识、OpenCV基础用法、常用图像绘制方法、图像几何变换等,中期讲解图像处理的各种运算,包括图像点运算、形态学处理、图像锐化、图像增强、图像平滑等,后期研究图像识别、图像分割、图像分类、图像特效处理以及图像处理相关应用。
第二部分将讲解图像运算和图像增强,前面的文章详细介绍了图像灰度变换和阈值变换。本篇文章将结合直方图分别对比图像灰度变换前后的变化,方便读者更清晰地理解灰度变换和阈值变换。希望文章对您有所帮助,如果有不足之处,还请海涵。
文章目录
下载地址:记得点赞喔 O(∩_∩)O
- https://github.com/eastmountyxz/Python-zero2one
- 开源600多页电子书:https://github.com/eastmountyxz/HWCloudImageRecognition
前文赏析:
第一部分 基础语法
- [Python从零到壹] 一.为什么我们要学Python及基础语法详解
- [Python从零到壹] 二.语法基础之条件语句、循环语句和函数
- [Python从零到壹] 三.语法基础之文件操作、CSV文件读写及面向对象
第二部分 网络爬虫
- [Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例
- [Python从零到壹] 五.网络爬虫之BeautifulSoup基础语法万字详解
- [Python从零到壹] 六.网络爬虫之BeautifulSoup爬取豆瓣TOP250电影详解
- [Python从零到壹] 七.网络爬虫之Requests爬取豆瓣电影TOP250及CSV存储
- [Python从零到壹] 八.数据库之MySQL基础知识及操作万字详解
- [Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、键盘鼠标操作)
- [Python从零到壹] 十.网络爬虫之Selenium爬取在线百科知识万字详解(NLP语料构造必备技能)
第三部分 数据分析和机器学习
- [Python从零到壹] 十一.数据分析之Numpy、Pandas、Matplotlib和Sklearn入门知识万字详解(1)
- [Python从零到壹] 十二.机器学习之回归分析万字总结全网首发(线性回归、多项式回归、逻辑回归)
- [Python从零到壹] 十三.机器学习之聚类分析万字总结全网首发(K-Means、BIRCH、层次聚类、树状聚类)
- [Python从零到壹] 十四.机器学习之分类算法三万字总结全网首发(决策树、KNN、SVM、分类算法对比)
- [Python从零到壹] 十五.文本挖掘之数据预处理、Jieba工具和文本聚类万字详解
- [Python从零到壹] 十六.文本挖掘之词云热点与LDA主题分布分析万字详解
- [Python从零到壹] 十七.可视化分析之Matplotlib、Pandas、Echarts入门万字详解
- [Python从零到壹] 十八.可视化分析之Basemap地图包入门详解
- [Python从零到壹] 十九.可视化分析之热力图和箱图绘制及应用详解
- [Python从零到壹] 二十.可视化分析之Seaborn绘图万字详解
- [Python从零到壹] 二十一.可视化分析之Pyechart绘图万字详解
- [Python从零到壹] 二十二.可视化分析之OpenGL绘图万字详解
- [Python从零到壹] 二十三.十大机器学习算法之决策树分类分析详解(1)
- [Python从零到壹] 二十四.十大机器学习算法之KMeans聚类分析详解(2)
- [Python从零到壹] 二十五.十大机器学习算法之KNN算法及图像分类详解(3)
- [Python从零到壹] 二十六.十大机器学习算法之朴素贝叶斯算法及文本分类详解(4)
- [Python从零到壹] 二十七.十大机器学习算法之线性回归算法分析详解(5)
- [Python从零到壹] 二十八.十大机器学习算法之SVM算法分析详解(6)
- [Python从零到壹] 二十九.十大机器学习算法之随机森林算法分析详解(7)
- [Python从零到壹] 三十.十大机器学习算法之逻辑回归算法及恶意请求检测应用详解(8)
- [Python从零到壹] 三十一.十大机器学习算法之Boosting和AdaBoost应用详解(9)
- [Python从零到壹] 三十二.十大机器学习算法之层次聚类和树状图聚类应用详解(10)
第四部分 Python图像处理基础
- [Python从零到壹] 三十三.图像处理基础篇之什么是图像处理和OpenCV配置
- [Python从零到壹] 三十四.OpenCV入门详解——显示读取修改及保存图像
- [Python从零到壹] 三十五.图像处理基础篇之OpenCV绘制各类几何图形
- [Python从零到壹] 三十六.图像处理基础篇之图像算术与逻辑运算详解
- [Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制
- [Python从零到壹] 三十八.图像处理基础篇之图像几何变换(平移缩放旋转)
- [Python从零到壹] 三十九.图像处理基础篇之图像几何变换(镜像仿射透视)
- [Python从零到壹] 四十.图像处理基础篇之图像量化处理
- [Python从零到壹] 四十一.图像处理基础篇之图像采样处理
- [Python从零到壹] 四十二.图像处理基础篇之图像金字塔向上取样和向下取样
第五部分 Python图像运算和图像增强
- [Python从零到壹] 四十三.图像增强及运算篇之图像点运算和图像灰度化处理
- [Python从零到壹] 四十四.图像增强及运算篇之图像灰度线性变换详解
- [Python从零到壹] 四十五.图像增强及运算篇之图像灰度非线性变换详解
- [Python从零到壹] 四十六.图像增强及运算篇之图像阈值化处理
- [Python从零到壹] 四十七.图像增强及运算篇之腐蚀和膨胀详解
- [Python从零到壹] 四十八.图像增强及运算篇之形态学开运算、闭运算和梯度运算
- [Python从零到壹] 四十九.图像增强及运算篇之顶帽运算和底帽运算
- [Python从零到壹] 五十.图像增强及运算篇之图像直方图理论知识和绘制实现
- [Python从零到壹] 五十一.图像增强及运算篇之图像灰度直方图对比分析万字详解
第六部分 Python图像识别和图像高阶案例
第七部分 NLP与文本挖掘
第八部分 人工智能入门知识
第九部分 网络攻防与AI安全
第十部分 知识图谱构建实战
扩展部分 人工智能高级案例
作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。
一.灰度增强直方图对比
图像灰度上移变换使用的表达式为:
- DB=DA+50
该算法将实现图像灰度值的上移,从而提升图像的亮度,结合直方图对比的实现代码如下所示。
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图像
img = cv2.imread('lena-hd.png')
#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)
#图像灰度上移变换 DB=DA+50
for i in range(height):
for j in range(width):
if (int(grayImage[i,j]+50) > 255):
gray = 255
else:
gray = int(grayImage[i,j]+50)
result[i,j] = np.uint8(gray)
#计算原图的直方图
hist = cv2.calcHist([img], [0], None, [256], [0,255])
#计算灰度变换的直方图
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])
#原始图像
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')
#绘制掩膜
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")
#绘制掩膜设置后的图像
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')
#绘制直方图
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()
其运行结果如图1所示,其中(a)表示原始图像,(b)表示对应的灰度直方图,(c)表示灰度上移后的图像,(d)是对应的直方图。对比发现,图1(d)比图1(b)的灰度级整体高了50,曲线整体向右平移了50个单位。
二.灰度减弱直方图对比
该算法将减弱图像的对比度,使用的表达式为:
- DB=DA×0.8
Python结合直方图实现灰度对比度减弱的代码如下所示。
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图像
img = cv2.imread('lena-hd.png')
#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)
#图像对比度减弱变换 DB=DA×0.8
for i in range(height):
for j in range(width):
gray = int(grayImage[i,j]*0.8)
result[i,j] = np.uint8(gray)
#计算原图的直方图
hist = cv2.calcHist([img], [0], None, [256], [0,255])
#计算灰度变换的直方图
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])
#原始图像
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')
#绘制掩膜
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")
#绘制掩膜设置后的图像
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')
#绘制直方图
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()
其运行结果如图2所示,其中(a)和(b)表示原始图像和对应的灰度直方图,(c)和(d)表示灰度减弱或对比度缩小的图像及对应的直方图。图2(d)比图2(b)的灰度级整体缩小了0.8倍,绘制的曲线更加密集。
三.图像反色直方图对比
该算法将图像的颜色反色,对原图像的像素值进行反转,即黑色变为白色,白色变为黑色,使用的表达式为:
- DB=255-DA
实现代码如下所示。
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图像
img = cv2.imread('lena-hd.png')
#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)
#图像灰度反色变换 DB=255-DA
for i in range(height):
for j in range(width):
gray = 255 - grayImage[i,j]
result[i,j] = np.uint8(gray)
#计算原图的直方图
hist = cv2.calcHist([img], [0], None, [256], [0,255])
#计算灰度变换的直方图
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])
#原始图像
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')
#绘制掩膜
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")
#绘制掩膜设置后的图像
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')
#绘制直方图
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()
其运行结果如图3所示,其中(a)和(b)表示原始图像和对应的灰度直方图,(c)和(d)表示灰度反色变换图像及对应的直方图。图3(d)与图3(b)是反相对称的,整个灰度值满足DB=255-DA表达式。
四.图像对数变换直方图对比
该算法将增加低灰度区域的对比度,从而增强暗部的细节,使用的表达式为:
下面代码实现了图像灰度的对数变换及直方图对比。
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图像
img = cv2.imread('lena-hd.png')
#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)
#图像灰度对数变换
for i in range(height):
for j in range(width):
gray = 42 * np.log(1.0 + grayImage[i,j])
result[i,j] = np.uint8(gray)
#计算原图的直方图
hist = cv2.calcHist([img], [0], None, [256], [0,255])
#计算灰度变换的直方图
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])
#原始图像
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')
#绘制原始图像直方图
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")
#灰度变换后的图像
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')
#灰度变换图像的直方图
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()
其运行结果如图4所示,其中(a)和(b)表示原始图像和对应的灰度直方图,(c)和(d)表示灰度对数变换图像及对应的直方图。
五.图像阈值化处理直方图对比
该算法原型为threshold(Gray,127,255,cv2.THRESH_BINARY),当前像素点的灰度值大于thresh阈值时(如127),其像素点的灰度值设定为最大值(如9位灰度值最大为255);否则,像素点的灰度值设置为0。二进制阈值化处理及直方图对比的Python代码如下所示。
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图像
img = cv2.imread('lena-hd.png')
#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#二进制阈值化处理
r, result = cv2.threshold(grayImage, 127, 255, cv2.THRESH_BINARY)
#计算原图的直方图
hist = cv2.calcHist([img], [0], None, [256], [0,256])
#计算阈值化处理的直方图
hist_res = cv2.calcHist([result], [0], None, [256], [0,256])
#原始图像
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')
#绘制原始图像直方图
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")
#阈值化处理后的图像
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')
#阈值化处理图像的直方图
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()
其运行结果如图5所示,其中(a)和(b)表示原始图像和对应的灰度直方图,(c)和(d)表示图像阈值化处理及对应的直方图,图5(d)中可以看到,灰度值仅仅分布于0(黑色)和255(白色)两种灰度级。
六.总结
本文主要讲解图像直方图理论知识以及直方图绘制方法,包括灰度增强直方图对比、灰度减弱直方图对比、图像反色直方图对比、图像对数变换直方图对比、图像阈值化处理直方图对比。灰度直方图是灰度级的函数,描述的是图像中每种灰度级像素的个数,反映图像中每种灰度出现的频率。这篇文章的知识点将为后续图像处理和图像运算对比提供支撑。
感谢在求学路上的同行者,不负遇见,勿忘初心。图像处理系列主要包括三部分,分别是:
(By:Eastmount 2022-08-10 夜于武汉 http://blog.csdn.net/eastmount/ )
参考文献:
- [1] 冈萨雷斯. 数字图像处理(第3版)[M]. 北京:电子工业出版社, 2013.
- [2] 张恒博, 欧宗瑛. 一种基于色彩和灰度直方图的图像检索方法[J]. 计算机工程, 2004.
- [3] Eastmount. [数字图像处理] 四.MFC对话框绘制灰度直方图[EB/OL]. (2015-05-31). https://blog.csdn.net/eastmount/article/details/46237463.
- [4] 阮秋琦. 数字图像处理学(第3版)[M]. 北京:电子工业出版社, 2008.
- [5] Eastmount. [Python图像处理] 十一.灰度直方图概念及OpenCV绘制直方图[EB/OL]. (2018-11-06). https://blog.csdn.net/Eastmount/article/details/83758402.
以上是关于[Python从零到壹] 五十一.图像增强及运算篇之图像灰度直方图对比分析万字详解的主要内容,如果未能解决你的问题,请参考以下文章
[Python从零到壹] 五十六.图像增强及运算篇之图像平滑(中值滤波双边滤波)
[Python从零到壹] 五十九.图像增强及运算篇之图像锐化ScharrCannyLOG实现边缘检测
[Python从零到壹] 五十.图像增强及运算篇之图像直方图理论知识和绘制实现
[Python从零到壹] 五十.图像增强及运算篇之图像直方图理论知识和绘制实现