10.10数字图像处理作业,对一张图像进行以下操作:
1、 直方图均衡化
2、 用平滑滤波器(均值滤波和中值滤波)过滤图像
3、 用锐化滤波器(梯度算子和拉普拉斯算子)过滤图像
本次作业主要使用Python + OpenCV来实现。
使用Python自带的pip工具进行下载,一般下载的Python都会绑定pip工具,用来自动拓展Python插件包。
win+R打开程序之后输入cmd
在控制台输入【pip install opencv-python】即可自动安装
如果网速下载过慢,开即可提速,因为资源点在国外所以访问很慢。
简介
直方图均衡化,是一种对对比度进行调整的图像处理方法。
目的在于提高图像的全局对比度,使亮的地方更亮,暗的地方更暗。
常被用于背景和前景都太亮或者太暗的图像,尤其是 X 光中骨骼的显示以及曝光过度或者曝光不足的图片的调整。
实现原理,尽量将图片的灰度分布,均匀分布在整个0-255的灰度坐标轴上,使其尽可能的占满坐标轴。
平滑滤波的目的有两类:
一类是模糊;
另一类是消除噪音。
以下使用均值滤波和中值滤波两种方法来测试:
简介
中值滤波属于非线性的的空间滤波器。
它是将像素(中值计算中包括的原像素值)邻域内灰度的中值代替该像素的值。
假设窗口内有五点,其值为80、90、200、110和120,那么此窗口内各点的中值则为110。
中值滤波器的使用非常普遍,这是因为对于一定类型的随机噪声,它提供了优秀的去噪能力,比小尺寸的线性平滑滤波器(就是说均值滤波)的模糊程度明显要低。
如果说平滑滤波器是用来模糊和去噪,那么锐化滤波器就完全相反,是用来突出图像细节的工具。类似于全能扫描王,手机扫描完图片之后往往要进行锐化处理,让蚊子变得更加清晰可见(但是这个app具体用的什么算法我不知道)。
锐化滤波器主要有两种锐化方法:
使用一阶微分的图像锐化:梯度锐化
使用二阶微分的图像锐化:拉普拉斯锐化
简介
首先介绍下梯度,梯度并非是一个数值,梯度严格意义上是一个向量。
梯度算子中,邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。
特点:锐化的边缘信息较强
看起来边缘新的的锐化效果,确实很强,再看看拉普拉斯。
相比于梯度算子,有一定的抗干扰性,图像效果比较干净
之所以像粉笔画,是因为原图像未经过去噪就直接处理了。
可以先平滑滤波、高斯模糊来先处理一下再用拉普拉斯函数。
#导入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()