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

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

在这里插入图片描述


六.总结

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


http://www.kler.cn/a/289791.html

相关文章:

  • JAVA题目笔记(十五)经典算法题
  • 深入理解BERT模型配置:BertConfig类详解
  • leetcode hot100【LeetCode 114.二叉树展开为链表】java实现
  • AMD CPU下pytorch 多GPU运行卡死和死锁解决
  • ReactPress技术揭秘
  • Xshell,Shell的相关介绍与Linux中的权限问题
  • ECMAScript 与 JavaScript:主要区别与实例说明
  • Flutter 小技巧之 Row/Column 即将支持 Flex.spacing
  • Tiktok测评防关联秘籍:矩阵自养号策略全面解析
  • R语言 | 文件读取
  • 如何构建Java SpringBoot在线培训平台?集成Vue,实现课程管理,打造互动学习环境
  • 【nnUNet】环境安装
  • Ubuntu22.04服务器重启后没网络IP丢失
  • 24最新『ComfyUI』入门到入坟全套教程!!看到就是赚到!赶紧收藏!
  • 基于树莓派的儿童音频播发器—Yoto
  • [嵌入式] 设备没有联网的情况下如何安装库
  • Unity中保存数据的方法
  • 【3.8】贪心算法-解无重叠区间
  • vscode和edge浏览器等鼠标输入光标变透明
  • github中action作用和讲解
  • [物理专题]经典浮力题目的Fh图像绘制
  • Profinet 从站转 EtherNet/IP 从站网关
  • Django+Vue二手交易平台的设计与实现
  • 使用Redis如何实现集群会话同步?
  • 【RabbitMQ】核心概念
  • 【Go - vendor, 本地, 独立依赖包】