数字图像处理实验—— 将“原图.bmp”转换成灰度图像,并对得到的灰度图像进行直方图均衡化;用直方图规定化算法,对“原图.bmp”RGB三个通道的直方图分别改成与“参考图像.bmp”一致

1.实验目标

        1. 理解并运用直方图的概念与运用对图像进行相关分析与处理

        2. 理解并运用直方图均衡化的概念,并进行相关图像处理

        3. 掌握直方图规定化算法,对样例进行直方图规定化处理分析

        4. 将“原图.bmp”转换成灰度图像,并对得到的灰度图像进行直方图均衡化

        5. 采用直方图规定化算法,对“原图.bmp”RGB三个通道的直方图分别改成与“参考图像.bmp”一致

2.实验环境

        操作环境:Windows 10

        实验平台:PyCharm Community Edition 2022.3.1

        处理器:Intel(R) Core(TM) i7-10750H CPU @ 2.60GHz   2.59 GHz

        内存:16.0 GB

        Python解释器:Python 3.9

3.实验原理

1. 直方图的定义:

        直方图是对图像灰度分布统计的重要手段。灰度直方图表示图像中具有某种灰度级的像素个数,反映图像中每种灰度出现的频率。一般地,灰度直方图的横坐标是灰度级,纵坐标是该灰度级出现的次数,是图像最基本统计特征。通过直方图,可以直观地了解图像的对比度和亮度分布,修改直方图的形状可以达到图像增强目的。

2. 直方图的性质:

        (1)直方图是一幅图像中各像素灰度值出现次数(或频数)的统计结果,而未反映某一灰度值像素所在位置,即丢失了位置信息。

        (2)一幅图像对应一个直方图,但不同的图像可能有相同直方图。即图像与直方图之间是多对一的映射关系。

        (3)一幅图像各子区的直方图之和等于该图像全图的直方图。

3. 直方图相关数学表示:

        从概率的观点来理解,灰度出现的频率可看作其出现的概率,这样直方图就对应概率密度函数p(r)(pdf, probability density function),而概率分布P(r)函数就是直方图的累积和,即概率密度函数的积分。

4. 直方图的计算:

        若图像具有L级灰度(通常L=256级,8位灰度),则大小为M×N的灰度图像f(x, y) 的灰度直方图hist[0,…,L-1]可用如下算法得到:

        (1)初始化:hist[k]=0 ;    k=0, …, L-1。

        (2)统计:hist[f(x, y)]++ ;    x=0, …, M-1; y = 0, …, N-1。

        (3)归一化:hist[f(x, y)]/=MN。

        其中,直方图的归一化是一个可选项,若不需要特殊处理可不进行此项操作。

5. 直方图均衡化:

        (1)定义:

        根据熵理论可知当h[0], h[1],…, h[L-1]相等时,图像信息量最大。均衡化的目的是使每个h[i]都相等,就是把原始图像的直方图变换为均匀分布的形式。图像像素个数为n,L是有效灰度级个数,对于一个均衡化的直方图来说,应该在每个灰度级上n/L个像素。

        (2)熵:是信息量的度量,定义为:

        其中,pi是符号i出现的概率。在图像中,pr是灰度级r出现的概率,可以证明,当p0=p1=…=p255=1/256时,H取值最大,即图像的信息量最大。

(3)直方图均衡化的两种情况:

        通过变换g=T(f)得到直方图均衡化的效果,需要考虑两种情况:

        1)多个至一个:若有连续n个灰度级的频数之和等于n/L,则必导致它们合并成一个灰度级。

        2)一个到多个:若有某个灰度级的频数是n/LR倍,则必须将其分为R个不同的灰度级,每个上都有n/L个像素。

        设变换前的图像直方图为h1,要求变换后得到的图像直方图为h2,如果将原始灰度级f变换为灰度级g,则必须满足:

从而有:

其中H1(f)是像素分布函数(累积函数),L是有效灰度的个数,L≤256。

4)直方图均衡化的步骤:

        法1:

  • 求出原图的灰度直方图,记为h
  • 计算图像各灰度级的累计分布H
  • 计算新图像的像素灰度值

        法2:

  • 求出原图的灰度直方图,记为h
  • 求出图像的像素个数,记为n
  • 计算每个灰度级的pdf,即每类像素在整个图像中所占的比例。

  • 计算图像各灰度级的累计分布hp

  • 计算新图像的像素灰度值

5)直方图均衡化分析:

        1)均衡化后的结果不是均衡的,因为只合并不分解

        2)信息量没有增加,反而减少了,因为均衡化后图像的有效灰度级一般<L

        3)能够增加图像的全局对比度。对于低对比度图像拉大了反差,将拥有特别多像素的灰度级变得跟前后灰度级拉开了距离,从而使得该灰度级的像素在均衡化后的图像中特别显眼

6. 直方图规定化:

(1)定义:

        把直方图变换为某个特定形状,有选择地增强某个灰度范围内的对比度。

2)直方图规定化步骤:

       假设原图像为f,直方图规定化后得到的图像为g,待匹配(参考)图像为m

  • 计算fm的归一化灰度直方图,记为pfpm, 即:

  • fm计算累积直方图:

  • 对每个像素值f(x, y),找到使式(2)最小的t*,即为规定化后得到的灰度值g(x, y),即式(1)。

3)直方图规定化与直方图均衡化的比较:

        直方图均衡化:自动增强,效果不易控制,总得到全图增强的结果

        直方图规定化:有选择地增强,须给定需要的直方图,可特定增强的结果

        直方图均衡化可以看作目标直方图为均匀分布的直方图规定化

4.主要代码和结果

        1. 将“原图.bmp”转换成灰度图像,并对得到的灰度图像进行直方图均衡化

        代码实现如下:

import cv2

# 指定图像文件路径

image_path = 'C:/Users/86198/PycharmProjects/pythonProject5/shuzituxiangchuli/yuantu.bmp'


# 读取图像

img = cv2.imread(image_path)


# 将图像转换为灰度图像

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)


# 对灰度图像进行直方图均衡化处理

equ_img = cv2.equalizeHist(gray_img)


# 显示原始图像和处理后的图像

cv2.imshow('Original Image', img)

cv2.imshow('Gray Image', gray_img)

cv2.imshow('Equalized Image', equ_img)


cv2.waitKey(0)

cv2.destroyAllWindows()

        实验结果如下:

        图1展示了原图,图2展示了原图转换为灰度图的图像,图3展示了灰度图进行直方图均衡化之后的图像。

图1 原图

图2 灰度图

图3 直方图均衡化后的灰度图

        2. 采用直方图规定化算法,对“原图.bmp”RGB三个通道的直方图分别改成与“参考图像.bpm”一致

        代码实现如下:

import cv2

import cv2


# 读取原图

original_image = cv2.imread("yuantu.bmp")

inference = cv2.imread('example.bmp')

# 转换为灰度图像

gray_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY)


# 进行直方图均衡化

equalized_image = cv2.equalizeHist(gray_image)


# 保存处理后的图像

cv2.imwrite("gray_img.bmp", gray_image)

cv2.imwrite("equalized_img.bmp", equalized_image)


b, g, r = cv2.split(original_image)

b_i, g_i, r_i = cv2.split(inference)


b_matched = cv2.equalizeHist(b, b_i)

g_matched = cv2.equalizeHist(g, g_i)

r_matched = cv2.equalizeHist(r, r_i)


matched_image = cv2.merge((b_matched, g_matched, r_matched))

cv2.imwrite('matched_image.bmp', matched_image)

cv2.imshow('matched_image.bmp', matched_image)

cv2.waitKey(0)

        实验结果如下:

        图4展示了以参考图像为标准的直方图规定化后的图像。

图4 直方图规定化

5.遇到的问题及解决过程

        1. opencv不可使用的问题。

                问题描述:已经在pycharm中下载opencv,但一直显示没有opencv。

        解决方案:

                ① 检查路径,是在anaconda下pythoch,不在opencv下。

                ② 进行改变路径,发现将其路径改为anaconda下的opencv后,仍然不行。

                ③ 将路径改为python3.9下的opencv后就可以使用opencv。

        2. 运行时图像未读入。

                问题描述:运行代码时,发现报错,参考图像未读入,怀疑图像太大读入不了。

        解决方案:

                ① 首先尝试重新放入图片,但仍报错。

                ② 其次修改路径,变为绝对路径,但仍报错。

                ③ 改变文件格式,bmp改为jpg,代码运行成功,出现想要的图像,但仍旧打不开参考图像。

6.体会

        这两个实验都是图像处理中常见的操作,第一个是将彩色图像转换为灰度图像,第二个是对图像进行直方图均衡化。

        对于第一个实验,将彩色图像转换为灰度图像是一种简单的图像处理方法。通过计算每个像素点的RGB值的加权平均值,可以得到该像素点的灰度值。这个实验可以帮助我们理解灰度图像的概念和生成方法。

        对于第二个实验,直方图均衡化是一种常用的图像增强方法。它可以提高图像的对比度和亮度,使图像更加清晰。通过将原始图像的直方图调整为参考图像的直方图,可以使两个图像在视觉上更加相似。这个实验可以帮助我们理解直方图均衡化的原理和应用。

        总的来说,这两个实验都比较简单,但能够帮助我们了解图像处理的基本概念和方法。通过实践操作,我们可以更好地理解这些概念,并将其应用到实际问题中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值