当前位置: 首页 > news >正文

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 = 255else: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(白色)两种灰度级。

在这里插入图片描述


六.总结

本文主要讲解图像直方图理论知识以及直方图绘制方法,包括灰度增强直方图对比、灰度减弱直方图对比、图像反色直方图对比、图像对数变换直方图对比、图像阈值化处理直方图对比。灰度直方图是灰度级的函数,描述的是图像中每种灰度级像素的个数,反映图像中每种灰度出现的频率。这篇文章的知识点将为后续图像处理和图像运算对比提供支撑。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 牛客小白月赛99:迷宫
  • 中国化学工程第七建设校招|EAS测评题库智联招聘攻略考什么
  • ssm基于微信小程序的校园商铺系统论文源码调试讲解
  • docker pull命令拉取镜像失败的解决方案
  • 三级_网络技术_59_应用题
  • 数学建模强化宝典(9)遗传算法
  • 编程工具合集
  • Spring Boot集成Spring Cloud Scheduler进行任务调度
  • C++实现电话薄管理系统
  • Java 输入与输出之 NIO.2【AIO】【Path、Paths、Files】【walkFileTree接口】探索之【三】
  • 57-java csrf防御方案
  • docker实战基础一 (Docker基础命令)
  • 外业精灵实时查看区域等高线(如何显示等高线的高程值)
  • unity GridLayoutGroup真正的居中
  • 前段框架有哪些
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • gitlab-ci配置详解(一)
  • Java 多线程编程之:notify 和 wait 用法
  • js ES6 求数组的交集,并集,还有差集
  • js中的正则表达式入门
  • MySQL主从复制读写分离及奇怪的问题
  • node 版本过低
  • php面试题 汇集2
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Service Worker
  • win10下安装mysql5.7
  • windows下mongoDB的环境配置
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 记一次和乔布斯合作最难忘的经历
  • 简单数学运算程序(不定期更新)
  • 如何解决微信端直接跳WAP端
  • 如何设计一个微型分布式架构?
  • 实习面试笔记
  • 数组的操作
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 原生js练习题---第五课
  • 正则学习笔记
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​TypeScript都不会用,也敢说会前端?
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #pragma multi_compile #pragma shader_feature
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (C语言)字符分类函数
  • (libusb) usb口自动刷新
  • (苍穹外卖)day03菜品管理
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916