python直方图均衡化函数,Python作业:直方图、均衡化、高斯滤波

b293e9204963cc7b9e4d14019faa4d25.pngnBT少儿编程网-https://www.pxcodes.com

python直方图、均衡化、高斯滤波nBT少儿编程网-https://www.pxcodes.com测试原图

直方图

基本原理

matplotlib库绘制直方图

RGB三通道直方图

直方图均衡化

基本原理

PCV库完成直方图均衡化

高斯滤波

基本原理

opencv高斯滤波实现nBT少儿编程网-https://www.pxcodes.com

(免费学习推荐:python视频教程)nBT少儿编程网-https://www.pxcodes.com

测试原图nBT少儿编程网-https://www.pxcodes.com676e9c6c867e9c36a8e8d1cc7c3a6f68.png

03c508090328cee7fac36bbd97b1c9aa.pngnBT少儿编程网-https://www.pxcodes.com

直方图nBT少儿编程网-https://www.pxcodes.com

基本原理nBT少儿编程网-https://www.pxcodes.com

什么是直方图:图像的直方图描述图像的灰度级和对应灰度级在图像中出现的次数(频率)的关系,通过直方图可以进行图像分割、检索、分类等操作nBT少儿编程网-https://www.pxcodes.com

matplotlib库的hist函数:hist函数能够帮助绘制直方图。它的参数很多,这里用到前两个参数:x、bins。x参数表示一个像素的一维数组,如果是一维以上的数组可以使用flatten方法展平成一维,一般来说读入一幅图片都是一个二维的矩阵,都需要进行展平的操作。bins参数表示要显示直方图的柱数nBT少儿编程网-https://www.pxcodes.com

假设有一个二维数组img=[[159,120,130],[100,84,92],[168,150,212]]。其数字表示图像的像素值,展平后img=[159,120,130,100,84,92,168,150,212],使用hist函数绘制出的直方图如下图。横轴表示像素值,纵轴表示该像素值出现的频率

672fe488480e5438a5fb8a100c382ce0.png

opencv提供的cv2.calcHist()绘制直方图:calcHist函数需要传入读取的图片image;图像的通道channels,如果是灰度图像channels=0,如果分别是r、g、b通道,则传入0、1、2。nBT少儿编程网-https://www.pxcodes.com

matplotlib库绘制直方图nBT少儿编程网-https://www.pxcodes.com

课本代码nBT少儿编程网-https://www.pxcodes.comfrom PIL import Imagefrom pylab import *# 解决中文乱码plt.rcParams['font.sans-serif'] = 'SimHei'plt.rcParams['axes.unicode_minus'] = False#im = array(Image.open('headimage.jpeg').convert('L')) # 打开图像,并转成灰度图像print(im)figure()subplot(121)gray()contour(im, origin='image') #画图axis('equal') # 自动调整比例axis('off') # 去除x y轴上的刻度title(u'图像轮廓')subplot(122)# flatten()函数可以执行展平操作,返回一个一维数组hist(im.flatten(), 128)print(im.flatten())title(u'图像直方图')plt.xlim([0,260])plt.ylim([0,11000])show()

运行结果

4d53b4d5d56c74e2f36b0fd60cfc55a4.pngnBT少儿编程网-https://www.pxcodes.com

RGB三通道直方图nBT少儿编程网-https://www.pxcodes.com

代码实现nBT少儿编程网-https://www.pxcodes.comimport cv2from matplotlib import pyplot as plt

img = cv2.imread('headimage.jpeg',1)color = ('b','g','r')for i,col in enumerate(color):

histr = cv2.calcHist([img],[i],None,[256],[0,256])

plt.plot(histr,color = col)

plt.xlim([0,256])plt.show()

运行结果

ab7f3348d2baffa95d79d6c23011e044.pngnBT少儿编程网-https://www.pxcodes.com

直方图均衡化nBT少儿编程网-https://www.pxcodes.com

基本原理nBT少儿编程网-https://www.pxcodes.com

什么是直方图均衡化:直方图均衡化是利用图像的直方图对对比度进行调整,是图像增强的一种方法。从图片直观上看,均衡化后的图片对比度更强,更加清晰,特征更加明显;从直方图上看,均衡化后的图片的直方图灰度值出现的频率更加均匀。nBT少儿编程网-https://www.pxcodes.com

如何均衡化直方图:nBT少儿编程网-https://www.pxcodes.com直方图均衡化首先要读取一张图片img,并计算该图片的直方图的值imhist(可以使用histogram函数)。

得到直方图的值后需要计算该直方图的累计直方图cdf(cdf[i]等于imhist[0]到imhist[i]的总和,可以使用cumsum函数直接得到)。

**后就是进行直方图的均衡化,对于图片第i行第j列的像素值img[i, j],利用公式 img[i, j] = cdf[ img[i,j] ] / (m*n)*255进行计算,得到均衡化后的像素值,然后再计算均衡化后的图片的直方图,就得到均衡化后的直方图

使用PCV库的histeq函数均衡化:传入图像im,返回均衡化后的直方图和累计直方图cdf。 nBT少儿编程网-https://www.pxcodes.com

PCV库完成直方图均衡化nBT少儿编程网-https://www.pxcodes.com

课本代码nBT少儿编程网-https://www.pxcodes.com# -*- coding: utf-8 -*-from PIL import Imagefrom pylab import *from PCV.tools import imtools# 添加中文字体支持from matplotlib.font_manager import FontProperties

font = FontProperties(fname=r"c:windowsfontsSimSun.ttc", size=14)im = array(Image.open('tire.jpg').convert('L')) # 打开图像,并转成灰度图像im2, cdf = imtools.histeq(im)figure()subplot(2, 2, 1)axis('off')gray()title(u'原始图像', fontproperties=font)imshow(im)subplot(2, 2, 2)axis('off')title(u'直方图均衡化后的图像', fontproperties=font)imshow(im2)subplot(2, 2, 3)axis('off')title(u'原始直方图', fontproperties=font)hist(im.flatten(), 128, density=True)subplot(2, 2, 4)axis('off')title(u'均衡化后的直方图', fontproperties=font)hist(im2.flatten(), 128, density=True)show()

运行结果

7d36998af3d4200e2d580917f0bbcea8.png

通过运行结果可以得到,因为原图像整体较暗(黑),是的原图像的直方图在低像素上出现的频率较高,高像素的频率低。通过直方图均衡化后,图像整体变亮,观察直方图发现低像素的频率有所降低,而高像素的频率升高,使得图像有了更明显的对比度nBT少儿编程网-https://www.pxcodes.com

高斯滤波nBT少儿编程网-https://www.pxcodes.com

基本原理nBT少儿编程网-https://www.pxcodes.com

什么是高斯滤波:高斯滤波是一种线性平滑滤波,它将正太分布用于图像处理,适用于消除高斯噪声,能够对图片进行模糊处理,使图像变得平滑,使图片产生模糊的效果。nBT少儿编程网-https://www.pxcodes.com

高斯滤波原理:高斯滤波是用户指定一个模板,然后通过这个模板对图像进行卷积,所进行的卷积操作就是将模板中心周围的像素值进行加权平均后替换模板中心的像素值

dec8449be8f242569ee2b058e9a53ed0.pngnBT少儿编程网-https://www.pxcodes.com

opencv高斯滤波实现nBT少儿编程网-https://www.pxcodes.com

代码实现nBT少儿编程网-https://www.pxcodes.comimport cv2import matplotlib.pyplot as plt

im=cv2.imread("tire.jpg")# 高斯滤波img_Guassian = cv2.GaussianBlur(im,(5,5),0)plt.subplot(121)plt.imshow(im)plt.subplot(122)plt.imshow(img_Guassian)plt.show()

运行结果

9f8dd90550e44b7c689d271f45bb2c76.png

从运行结果中可以看出,经过高斯滤波后的图像变得模糊了,边缘变得没有那么明显,图像变得平滑nBT少儿编程网-https://www.pxcodes.com相关免费学习推荐:(视频)nBT少儿编程网-https://www.pxcodes.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值