写在前面

HIT大三上学期视听觉信号处理课程中视觉部分的实验二,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验二。

由于时间紧张,代码没有进行任何优化,实验算法仅供参考。

实验要求

实现图像直方图均衡化,要求显示均衡化前、后直方图以及均衡化后图像。

对单通道图像进行DFT变换,要求显示幅度图和相位图,并设计理想高通滤波器和高斯低通滤波器对图像进行频域滤波,并显示滤波之后的图像。 注:除DFT和IDFT外,不允许调库

实验代码

代码首先贴在这里,仅供参考

首先是实现图像直方图均衡化的代码

from ReadBmp import ReadBmp

import matplotlib.pyplot as plt

import numpy as np

filename1 = "1.bmp"

bmp = ReadBmp(filename1)

bmp.gray()

# 统计各像素点数

h = np.array([0 for i in range(256)])

h1 = []

for pixel in bmp.data:

h[pixel[0]] = h[pixel[0]] + 1

h1.append(pixel[0])

# 画出原先的直方图

plt.subplot(1,2,1)

plt.hist(h1, bins = 256)

# 归一化

hs = h / len(bmp.data)

# 计算累计分布

hp = np.array([0.0 for i in range(256)])

for i in range(256):

hp[i] = np.round(np.sum(hs[0:i+1]) * 255)

T = hp.astype('uint8')

# 创建新图像,并统计新图像的各个像素点的个数

hn = np.array([0 for i in range(256)])

h2 = []

for pixel in bmp.data:

s = T[pixel[0]]

pixel[0] = s

pixel[1] = s

pixel[2] = s

hn[pixel[0]] = hn[pixel[0]] + 1

h2.append(s)

bmp.creataBmp("2.bmp")

# 画出新图像的直方图

plt.subplot(1,2,2)

plt.hist(h2, bins = 256)

plt.show()

其中读取bmp图像的程序是我自己写的,这里不再赘述(直接调用了实验一写好的bmp文件读取程序,具体代码见github)

然后是理想高通滤波和高斯低通滤波的程序

import numpy as np

import cv2

import matplotlib.pyplot as plt

def IdealHighPassFiltering(f_shift):

# 设置滤波半径

D0 = 8

# 初始化

m = f_shift.shape[0]

n = f_shift.shape[1]

h1 = np.zeros((m, n))

x0 = np.floor(m/2)

y0 = np.floor(n/2)

for i in range(m):

for j in range(n):

D = np.sqrt((i - x0)**2 + (j - y0)**2)

if D >= D0:

h1[i][j] = 1

result = np.multiply(f_shift, h1)

return result

def GaussLowPassFiltering(f_shift):

# 设置滤波半径

D0 = 8

# 初始化

m = f_shift.shape[0]

n = f_shift.shape[1]

h1 = np.zeros((m, n))

x0 = np.floor(m/2)

y0 = np.floor(n/2)

for i in range(m):

for j in range(n):

D = np.sqrt((i - x0)**2 + (j - y0)**2)

h1[i][j] = np.exp((-1)*D**2/2/(D0**2))

result = np.multiply(f_shift, h1)

return result

img =cv2.imread('1.bmp',0)

f=np.fft.fft2(img)

f_shift=np.fft.fftshift(f)

# 幅度图

s= np.log(abs(f_shift))

# 相位图

p= abs(np.angle(f_shift))

plt.subplot(2,2,1)

plt.imshow(s, 'gray')

plt.subplot(2,2,2)

plt.imshow(p, 'gray')

# 理想高通滤波

IHPF = IdealHighPassFiltering(f_shift)

new_f1 = np.fft.ifftshift(IHPF)

new_image1 = np.uint8(np.abs(np.fft.ifft2(new_f1)))

plt.subplot(2,2,3)

plt.imshow(new_image1, 'gray')

# 高斯低通滤波

GLPF = GaussLowPassFiltering(f_shift)

new_f2 = np.fft.ifftshift(GLPF)

new_image2 = np.uint8(np.abs(np.fft.ifft2(new_f2)))

plt.subplot(2,2,4)

plt.imshow(new_image2, 'gray')

plt.show()

实验结果

实验结果的图像如下图所示

这是直方图均衡化的运行结果,其中左图是做直方图均衡化前对像素统计的直方图,右图是做直方图均衡化后对像素统计的直方图

这是画出图像的幅度图和相位图,对图像做理想高通滤波和高斯低通滤波的结果,其中1是幅度图,2是相位图,3是理想高通滤波的结果,4是高斯低通滤波的结果

要点讲解

关于实验算法的大致流程,已在程序中用注释标明,这里只记录需要注意的地方

在直方图均衡化中,要注意直方图函数的用法,该函数可以对输入的矩阵中的数值进行自动的分类,而不用手动分好之后再用直方图函数去画,之前没有仔细看该函数的用法,导致找了好长时间没找到问题。

关于直方图均衡化的原理,需要一定的数学公式的推导,然而其结论十分简单,只有一个公式,对理解公式推导无需求的直接拿公式来用就可以了。(即程序中的归一化加计算累积分布部分)

关于理想高通滤波和高斯低通滤波,可以看到其代码大体框架是一致的,只有中间if语句中的判断条件不一样,理解原理之后直接替换if语句即可。

最终画出理想高通滤波的图像时,网上给出的一些运行结果可能和我们运行的不一致,类似于下图中图一的图像,原因在于这一句话中:new_image1 = np.uint8(np.abs(np.fft.ifft2(new_f1))),注意到中间调用了np.abs()函数,由于经过DFT变换之后所得的数值是复数,而不是实数,若将np.abs()替换为np.real(),即只取其实部,则得到的是图一,而使用np.abs(),得到的则是图二。个人感觉图二才是相对正确一些的结果,图一相当于将虚部舍弃掉了,这是不太好的。

以下是图一

以下是图二

知识总结

关于直方图均衡化的数学原理,我参考的是这篇博客。直方图均衡化的公式推导较为复杂,然而其结果却十分简单,因此在python中一个循环就实现了。

直方图均衡化的数学原理

其中在理想高通和高斯低通滤波器中,需要用到矩阵乘法,关于几种不同的矩阵乘法参考的是这篇博客

numpy 三种矩阵乘法

实验总结

很简单的一个实验,总时间加起来大致4个小时左右,做这么快的主要原因是,本来同学来哈尔滨找我玩,正玩得开心,结果突然告诉我这个实验要今天晚上交(之前以为这个实验还有一周的ddl),所以潜能爆发,从三点写到六点差不多就写完了

python高通滤波器设计_python实现直方图均衡化,理想高通滤波与高斯低通滤波相关推荐

  1. python高通滤波_python实现直方图均衡化,理想高通滤波与高斯低通滤波

    写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验二,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验二. 由于时间紧张,代码没有进行任何优化, ...

  2. python理想低通滤波、巴特沃斯低通滤波、高斯低通滤波实现

    代码 代码如下(示例): import numpy as np import cv2 as cv image = cv.imread('2.PNG') # print(image.shape) ima ...

  3. 用matlab编程实现数字图像理想低通滤波、高斯低通滤波和巴特沃斯低通滤波去噪算法

    1 理想低通滤波 %理想低通 I = imread('fig.png'); I=rgb2gray(I); figure(1); subplot(221),imshow(I); title('原图像') ...

  4. matalb 图像处理 低通滤波和高通滤波 (理想,巴特沃斯,高斯 含代码)

    低通滤波和高通滤波 主要类型和公式 主要效果图 各类型的函数代码 最终比较代码 主要类型和公式 1.低通滤波 主要分为理想低通滤波,巴特沃斯低通滤波,高斯低通滤波 理想低通滤波: 其中:对于大小为M* ...

  5. c++ opencv数字图像处理:频率域滤波--低通滤波--理想低通滤波

    文章目录 前言 一.理想低通滤波器(ILPF) 二.代码 三.说明 前言 数字图像处理c++ opencv(VS2019 opencv4.53)持续更新 一.理想低通滤波器(ILPF) 通过设置频率半 ...

  6. Matlab实现 理想低通、巴特沃斯低通、高斯低通、理想高通、巴特沃斯高通、高斯高通(d=10,50,150)

    数字图像处理第二次编程课后作业 理想低通(d=10,50,150): close all; clear all;%% ---------Ideal Lowpass Filters (Fre. Doma ...

  7. python opencv 直方图均衡_详解python OpenCV学习笔记之直方图均衡化

    本文介绍了python OpenCV学习笔记之直方图均衡化,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/d5/daf/tutorial_py_hi ...

  8. python+opencv图像处理之七:直方图均衡化

    python+opencv图像处理之七:直方图均衡化 目录 python+opencv图像处理之七:直方图均衡化 一.直方图均衡化 二.直方图绘制 三.直方图均衡化 四.有限对比适应性直方图均衡化 一 ...

  9. matlab常见的图像增强技术(包括基于幂次变换,对图像进行均衡化处理,巴特沃斯低通,理想低通,梯形低通滤波, 均值滤波,中值滤波,最大,最小值滤波,修正后的阿尔法滤波器)

    1.基于幂次变换中的r值,比较不同r 值下图像增强的效果 代码 : I = imread('D:\图片\TH.JFIF');subplot (1,4,1);imshow(I);title('原始图像' ...

最新文章

  1. 09_Mybatis开发Dao方法——mapper代理开发规范
  2. 如何生成安全的密码 Hash:MD5, SHA, PBKDF2, BCrypt
  3. C# 导出EXCEL文件
  4. win10电脑插耳机没声音_电脑没有声音是什么原因 教您电脑突然没声音怎么解决...
  5. (软件工程复习核心重点)第七章软件维护习题
  6. java abs在哪个包,Java StrictMath abs()方法
  7. .NET客户端实现Redis中的管道(PipeLine)与事物(Transactions)
  8. Ckeditor编辑器的配置使用
  9. [代码整洁之道].(美)马丁.扫描版pdf
  10. sql思维导图---sql函数
  11. 总结oracle10g在Win10上安装时出现的问题及解决方案
  12. 浅析R语言单因素方差分析中的多重比较
  13. Java源码阅读绘图规范手册--[捷特版]
  14. Flask 视图的高级技术
  15. The Source and Develop of RootKit
  16. 大数据行业前景如何?
  17. 【工具】OmniGraffle 激活码、UML模板型版
  18. 社区医院信息系统的设计与实现
  19. IT 资产管理及其重要性
  20. 【微信小程序】picker 滚动选择器

热门文章

  1. 基于迭代次数和分类准确率的两种排序
  2. 服务器登陆密码到期登不上去_英雄联盟手游注册系统炸服怎么回事?服务器瘫痪登不上解决方法[多图]...
  3. 【UAV】光流模块、测量速度、快速入门及安装使用
  4. 2.7 负采样-深度学习第五课《序列模型》-Stanford吴恩达教授
  5. 3.4 归一化网络的激活函数-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  6. 3.6 权值初始化-机器学习笔记-斯坦福吴恩达教授
  7. 1.2 线性回归与梯度下降-机器学习笔记-斯坦福吴恩达教授
  8. Ardino基础教程 21_最简单最快控制LCD1602
  9. 雅客EXCEL (3)-合并取消单元格、平均值、添加序号
  10. Linux文件系统映像:Initranfs 和 Initrd