数字图像处理作业01
直方图均衡化
直方图均衡化是将原图像通过某种变化,得到一幅灰度直方图为均匀分布的新图像的方法。
这种方法通常用来增加许多图像的全局对比度。增强局部亮度的对比对而不影响整体的对比度。
实现
离散的灰度图像{x},其中 表示灰度i出现的次数,有:
关于灰度i的概率密度函数
相应对 $p_x$ 的累积分布函数,有:
$fx(i) = \sum{j=0}^{i}P_x(j)$
再创建一个形式为 $y=T(x)$ 的变换,对于原始图像中每个值产生一个y
最后将进行值的映射和变换:
$y’ = y(max{x}-min{x}) + min{x}$
应用:
- 对于背景和前景太亮或者太暗的图像非常有用。
- 例如对X光图像中更好地显示骨骼结构的曝光或曝光不足处理
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import cv2 import numpy as np
img = cv2.imread("preSny.jpg", 1) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.imshow("src", gray)
dst = cv2.equalizeHist(gray)
cv2.imshow("dst", dst)
cv2.waitKey(0) cv2.destoryAllWindows()
|
平滑空间滤波器
作用:主要用于去除图像中一些不重要的细节。
分类:
均值滤波器
均值滤波器属于线性滤波器,有:
- 减小图像灰度的“尖锐”变化
- 减小噪声
- 但由于图像边缘是图像灰度尖锐变化引起的,所以存在边缘模糊问题
中值滤波器
非线性滤波器
基于滤波器所在图像区域中像素的排序,由排序结果决定的值代替中心像素的值
中值滤波器:用像素领域内中间值代替该像素(寻找像素周围内的中间值)
主要计算公式:
$R = mid{Z_k| k = 1,2,…n}$
主要用途:去除噪声
算法的特点
- 去除噪声的同时,比较好的保留边的锐度和图像的细节(优于均值滤波器)
- 能够有效去除脉冲噪声:以黑白点叠加在图像上
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import cv2 import numpy as np
img00 = cv2.imread("demoShot.png",1) scale_percent = 45 img_width = int(img00.shape[1]*scale_percent / 100) img_height = int(img00.shape[0]*scale_percent / 100) dsize = (img_width, img_height) img00 = cv2.resize(img00, dsize)
img_medianBlur = cv2.medianBlur(img00, 7) img_Blur = cv2.blur(img00,(7,7))
cv2.imshow("originShot", img00) cv2.imshow("medianBlur", img_medianBlur) cv2.imshow("Blur", img_Blur)
cv2.waitKey(0) cv2.destroyAllWindows()
|
锐化滤波器
主要作用:
- 突出图像中的细节,增强被模糊的细节
- 印刷中的层次强调,弥补扫描钝化
超声探测成像,针对于分辨率低的图片
图像识别中的边缘提取
- 回复过度钝化,曝光不足的图像
- 尖锐目标识别
采用的是用微分的方式进行锐化,有一阶微分滤波器和二阶微分滤波器
梯度算子——一阶微分滤波器
边缘检测不是非常明显,边缘检测产生的噪声比较多
拉普拉斯算子——二阶微分滤波器
主要保留目标轮廓的锐化效果,边缘轮廓显示十分明显,适合于进行目标物体边缘检测
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| import cv2 import numpy as np
img = cv2.imread("apple.png", cv2.IMREAD_GRAYSCALE) img = cv2.resize(img, (300,400))
sobel_x = cv2.Sobel(img,cv2.CV_64F, 1, 0, ksize = 5) sobel_y = cv2.Sobel(img,cv2.CV_64F, 0, 1, ksize = 5)
sobel_x = cv2.convertScaleAbs(sobel_x) sobel_y = cv2.convertScaleAbs(sobel_y) sobel_xy = cv2.addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0)
scharr_x = cv2.Scharr(img, cv2.CV_64F, 1, 0) scharr_y = cv2.Scharr(img, cv2.CV_64F, 0, 1) scharr_x = cv2.convertScaleAbs(scharr_x) scharr_y = cv2.convertScaleAbs(scharr_y) scharr_xy = cv2.addWeighted(scharr_x, 0.5, scharr_y, 0.5, 0)
laplacian = cv2.Laplacian(img,cv2.CV_64F) laplacian = cv2.convertScaleAbs(laplacian)
cv2.imshow("origin", img) cv2.imshow("sobel", sobel_xy)
cv2.imshow("laplacian", laplacian)
cv2.waitKey(0) cv2.destroyAllWindows()
|