【数字图像处理1】直方图均衡化、平滑滤波器、锐化滤波器

一、前言

10.10数字图像处理作业,对一张图像进行以下操作:
1、 直方图均衡化
2、 用平滑滤波器(均值滤波和中值滤波)过滤图像
3、 用锐化滤波器(梯度算子和拉普拉斯算子)过滤图像

本次作业主要使用Python + OpenCV来实现。

二、 如何安装OpenCV

使用Python自带的pip工具进行下载,一般下载的Python都会绑定pip工具,用来自动拓展Python插件包。
 win+R打开程序之后输入cmd
 在控制台输入【pip install opencv-python】即可自动安装
 如果网速下载过慢,开即可提速,因为资源点在国外所以访问很慢。

三、 直方图均衡化

  1. 简介
     直方图均衡化,是一种对对比度进行调整的图像处理方法。
     目的在于提高图像的全局对比度,使亮的地方更亮,暗的地方更暗。
     常被用于背景和前景都太亮或者太暗的图像,尤其是 X 光中骨骼的显示以及曝光过度或者曝光不足的图片的调整。
     实现原理,尽量将图片的灰度分布,均匀分布在整个0-255的灰度坐标轴上,使其尽可能的占满坐标轴。 【数字图像处理1】直方图均衡化、平滑滤波器、锐化滤波器_第1张图片

  2. 核心代码
    【数字图像处理1】直方图均衡化、平滑滤波器、锐化滤波器_第2张图片

  3. 效果图
    【数字图像处理1】直方图均衡化、平滑滤波器、锐化滤波器_第3张图片

  4. 补充,彩色直方图均衡化
    原理和普通(灰度)直方图均衡化一样,是拉长当前红黄蓝三个色域至整个坐标轴。
    代码及示例图如下:
    【数字图像处理1】直方图均衡化、平滑滤波器、锐化滤波器_第4张图片
    【数字图像处理1】直方图均衡化、平滑滤波器、锐化滤波器_第5张图片

四、 平滑滤波器

平滑滤波的目的有两类:
 一类是模糊;
 另一类是消除噪音。
以下使用均值滤波和中值滤波两种方法来测试:

均值滤波

  1. 简介
     均值滤波法的思想是通过一点和邻域内像素点求平均来去除突变的像素点,从而滤掉一定噪声
     其优点是算法简单,计算速度快,其代价会造成图像在一定程度上的模糊。

  2. 核心代码
    【数字图像处理1】直方图均衡化、平滑滤波器、锐化滤波器_第6张图片

  3. 效果图
    【数字图像处理1】直方图均衡化、平滑滤波器、锐化滤波器_第7张图片

中值滤波

  1. 简介
     中值滤波属于非线性的的空间滤波器。
     它是将像素(中值计算中包括的原像素值)邻域内灰度的中值代替该像素的值。
     假设窗口内有五点,其值为80、90、200、110和120,那么此窗口内各点的中值则为110。
     中值滤波器的使用非常普遍,这是因为对于一定类型的随机噪声,它提供了优秀的去噪能力,比小尺寸的线性平滑滤波器(就是说均值滤波)的模糊程度明显要低。

  2. 核心代码
    【数字图像处理1】直方图均衡化、平滑滤波器、锐化滤波器_第8张图片

  3. 效果图
    【数字图像处理1】直方图均衡化、平滑滤波器、锐化滤波器_第9张图片

备注,下面的是均值滤波,上面的模糊程度更小。
【数字图像处理1】直方图均衡化、平滑滤波器、锐化滤波器_第10张图片

五、 锐化滤波器

如果说平滑滤波器是用来模糊和去噪,那么锐化滤波器就完全相反,是用来突出图像细节的工具。类似于全能扫描王,手机扫描完图片之后往往要进行锐化处理,让蚊子变得更加清晰可见(但是这个app具体用的什么算法我不知道)。
锐化滤波器主要有两种锐化方法:
 使用一阶微分的图像锐化:梯度锐化
 使用二阶微分的图像锐化:拉普拉斯锐化

梯度算子

  1. 简介
    首先介绍下梯度,梯度并非是一个数值,梯度严格意义上是一个向量。
    梯度算子中,邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。
    特点:锐化的边缘信息较强

  2. 核心代码
    【数字图像处理1】直方图均衡化、平滑滤波器、锐化滤波器_第11张图片

  3. 效果图
    以下分别是原图、进行x坐标处理的图、Y坐标处理的图、和最终锐化图
    【数字图像处理1】直方图均衡化、平滑滤波器、锐化滤波器_第12张图片

看起来边缘新的的锐化效果,确实很强,再看看拉普拉斯。

拉普拉斯算子

  1. 简介
    拉普拉斯算子,是二阶微分线性算子,与一阶微分相比,二阶微分的边缘定位能力更强,锐化效果更好。
    【数字图像处理1】直方图均衡化、平滑滤波器、锐化滤波器_第13张图片

  2. 核心代码
    【数字图像处理1】直方图均衡化、平滑滤波器、锐化滤波器_第14张图片

  3. 效果图
    【数字图像处理1】直方图均衡化、平滑滤波器、锐化滤波器_第15张图片

 相比于梯度算子,有一定的抗干扰性,图像效果比较干净
 之所以像粉笔画,是因为原图像未经过去噪就直接处理了。
 可以先平滑滤波、高斯模糊来先处理一下再用拉普拉斯函数。

【数字图像处理1】直方图均衡化、平滑滤波器、锐化滤波器_第16张图片


#导入cv模块
import cv2
import numpy as np
from matplotlib import pyplot as plt


#1.1、直方图处理
#导入本地图片
inputPic1 = cv2.imread('pic\\1.jpg',0)
#直方图均衡化处理之后,灰度范围变大,对比度变大,清晰度变大,所以能有效增强图像。
zhiFangTuPic = cv2.equalizeHist(inputPic1)
#把两张图片展示在一起,使用numpy的矩阵堆叠方法
result1 = np.hstack((inputPic1,zhiFangTuPic))
#输出
#cv2.imshow('inputPic',result1)



#1.2、彩色直方图均衡化
#直方图均衡化处理之后,灰度范围变大,对比度变大,清晰度变大,所以能有效增强图像。
inputPic2 = cv2.imread('pic\\2.jpg',1)
(b,g,r) = cv2.split(inputPic2) #色彩通道分解
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
temp = cv2.merge((bH,gH,rH),)#通道合成
#将输入图片和输出图片进行合并,方便观察
result2 = np.hstack((inputPic2,temp))
#展示图片
#cv2.imshow('inputPic',result2)



#2.1、均值滤波
inputPic3 = cv2.imread('pic\\2.jpg',1)
junzhilvboPic = cv2.blur(inputPic3, (5,5))
#将输入图片和输出图片进行合并,方便观察
result3 = np.hstack((inputPic2,junzhilvboPic))
#cv2.imshow('inputPic',result3)



#2.2、中值滤波
inputPic4 = cv2.imread('pic\\2.jpg',1)
zhongzhilvboPic = cv2.medianBlur(inputPic4, 5)
#将输入图片和输出图片进行合并,方便观察
result4 = np.hstack((inputPic4,zhongzhilvboPic))
#打印图片
#cv2.imshow('inputPic',result4)



#3.1、锐化滤波器-梯度算子
inputPic6 = cv2.imread('pic\\3.jpg',1)
# 水平梯度
sobelX = cv2.Sobel(inputPic6, cv2.CV_64F, 1, 0)
sobelX = np.uint8(np.absolute(sobelX))
#cv2.imshow("Sobel X", sobelX)
# 垂直梯度
sobelY = cv2.Sobel(inputPic6, cv2.CV_64F, 0, 1)
sobelY = np.uint8(np.absolute(sobelY))
#cv2.imshow("Sobel Y", sobelY)
# 结合x和y两个方向的梯度
sobelCombined = cv2.bitwise_or(sobelX,sobelY)
#cv2.imshow("Sobel Combined", sobelCombined)
#合并打印
result6 = np.hstack((inputPic6,sobelX,sobelY,sobelCombined))
cv2.imshow("Sobel XY", result6)


#3.2、锐化滤波器-拉普拉斯算子
#加载图片
inputPic5 = cv2.imread('pic\\3.jpg',0)
#深度采用cv2.CV_16S
gray_lap = cv2.Laplacian(inputPic5,cv2.CV_16S,ksize = 3)
laplacian = cv2.convertScaleAbs(gray_lap)
#合并图片
result5 = np.hstack((inputPic5,laplacian))
#打印
#cv2.imshow('inputPic',result5)



#dst = cv2.convertScaleAbs(gray_lap)
#laplacian=cv2.Laplacian(inputPic5,cv2.CV_64F,ksize = 3)#CV_16S为图像深度
#sobelx=cv2.Sobel(inputPic5,cv2.CV_64F,1,0,ksize=5)#1,0参数表示在x方向求一阶导数
#sobely=cv2.Sobel(inputPic5,cv2.CV_64F,0,1,ksize=5)#0,1参数表示在y方向求一阶导数
#将输入图片和输出图片进行合并,方便观察

cv2.waitKey()
cv2.destroyAllWindows()

你可能感兴趣的:(数字图像处理,opencv,python,人工智能,计算机视觉,1024程序员节)