文章目录
- 前言
- 简介
- 灰度变化
- 线性变换
- 指数
- 对数
- 直方图
- 直方图均衡化
- 空间滤波
- 低通滤波
- 高通滤波
前言
数字图像处理是计算机视觉的基础,许多经典的图像处理方法也在深度学习领域的模型结构设计思路有着借鉴,所以在此归纳学习内容,用简单的语言表达其思想。至于有效的使用经验、方法的原理公式,可以在《数字图像处理》冈萨雷斯版中寻找答案,内容太全面,且很多使用经验直接提供。
简介
灰度图是图像的基础,由0~255像素值组成,常见的彩色图是由rgb三通道构成,熟悉灰度图后可拓展至彩色图。(彩色空间不知rgb,还有hsv,CElab等)
灰度变换方法很多,一般称为图像增强。图像增强没有统一的标准衡量增强的好坏,也没有通用的方法放在四海皆准,需要根据具体问题和需求来灵活使用图像增强方法。
所以,也要求在进行传统数字图像处理时要真正理解不同变换方式和滤波方法的效果,便于更好得到需要效果。
灰度变化
逐像素计算,对每个像素点进行变换操作。
线性变换
- 翻转
s代表变换后像素值,c代表变换前像素值。 - 线性变换
a, b是变换的线性系数, s是变换后像素值,c为变换前。
指数
也称gamma变换,进行显示校正。
s为指数变换后像素值,c为变换前,a为系数,r为指数
img = cv2.imread(filename)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img = cv2.resize(img,(600,400))
paras=[1.0,2.0,3.0,4.0,5.0]
plt.figure(figsize=(12,6))
plt.subplot(231)
plt.title("org pic")
plt.imshow(img)
for i, para in enumerate(paras):
plt.subplot(232+i)
plt.title('1/%.1f'%para)
img1 = np.power(img/float(np.max(img)), 1/para)
plt.imshow(img1)
plt.tight_layout()
plt.show()
对数
s为指数变换后像素值,c为变换前,a为系数
直方图
统计图像中像素值数量,观察图像分布情况。(反映图像亮度分布情况)
#coding:utf8
import cv2
import matplotlib.pyplot as plt
import numpy as np
import sys
import os
filename='lena.jpg'
##------彩色直方图------##
img=cv2.imread(filename)
colors=['blue','green','red']
for i in range(3):
hist,x=np.histogram(img[:,:,i].ravel(),bins=256,range=(0,256))
plt.plot(0.5*(x[:-1]+x[1:]),hist,label=colors[i],color=colors[i])
plt.show()
##------灰度直方图------##
img=cv2.imread(filename)
imgGrey = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
colors=['grey']
for i in range(1):
hist,x=np.histogram(imgGrey[:,:].ravel(),bins=256,range=(0,256))
plt.plot(0.5*(x[:-1]+x[1:]),hist,label=colors[i],color=colors[i])
plt.show()
直方图均衡化
直接效果是将像素分布均匀,降低对比度。
#coding:utf8
import cv2
import numpy as np
img = cv2.imread("欠曝光.png", 1)
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
result = cv2.merge((bH, gH, rH))
cv2.imshow("dst", result)
cv2.imwrite("欠曝光直方图均衡.jpg",result)
空间滤波
低通滤波
将图像用空间卷积核进行卷积操作,将图像平滑去噪或者模糊。
## 图像平滑 ##
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('opencv_logo.png')
kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img,-1,kernel)
plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(dst),plt.title('Averaging') plt.xticks([]), plt.yticks([])
plt.show()
##----中值滤波----##
img_medianblur= cv2.medianBlur(img,5)
plt.subplot(343)
plt.title("media blur")
plt.imshow(img_medianblur)
residuals = img - img_medianblur;
plotResiduals(residuals,plt,344,"media blur residuals")
psnr=compare_psnr(imggt,img_medianblur)
print("media blur psnr:%f" %psnr)
##----非局部均值滤波----##
img_nonlocal= cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21)
plt.subplot(347)
plt.title("non local mean")
plt.imshow(img_nonlocal)
residuals = img - img_nonlocal;
plotResiduals(residuals,plt,348,"non local mean residuals")
psnr=compare_psnr(imggt,img_nonlocal)
print("non local mean psnr:%f" %psnr)
高通滤波
获取图像边缘轮廓
- 一阶滤波
##----高斯滤波----##
plt.figure(figsize=(16,10))
img_gaussian= cv2.GaussianBlur(img,(5,5),0)
plt.subplot(341)
plt.title("gauss blur")
plt.imshow(img_gaussian)
residuals = img - img_gaussian;
plotResiduals(residuals,plt,342,"gauss blur residuals")
psnr=compare_psnr(imggt,img_gaussian)
print("gauss blur psnr:%f"%psnr)
- 二阶滤波
二阶滤波对边缘和异常点敏感,常用于检测边缘和异常点。但一阶导数和二阶导数对噪声敏感,在处理前需要进行图像平滑处理降噪。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('dave.jpg',0)
#cv2.CV_64F 输出图像的深度(数据类型),可以使用-1, 与原图像保持一致 np.uint8
laplacian=cv2.Laplacian(img,cv2.CV_64F)
# 参数 1,0 为只在 x 方向求一阶导数,最大可以求 2 阶导数。
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
# 参数 0,1 为只在 y 方向求一阶导数,最大可以求 2 阶导数。
sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray') plt.title('Original'), plt.xticks([]), plt.yticks([]) plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray') plt.title('Laplacian'), plt.xticks([]), plt.yticks([]) plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray') plt.title('Sobel X'), plt.xticks([]), plt.yticks([]) plt.subplot(2,2,4),plt.imshow(sobely,cmap = 'gray') plt.title('Sobel Y'), plt.xticks([]), plt.yticks([]) plt.show()
最后是《数字图像处理》冈萨雷斯电子版:
链接:https://pan.baidu.com/s/149ORJH2xHZig424QxyLzCA
提取码:tg6m
opencv python版本电子版:
链接:https://pan.baidu.com/s/1YfsS14_H8XQBJIQ6C1Hqug
提取码:puu6