1.直方图均衡
显示直方图
plt.hist(im.flatten(),128)
#基于CV2的直方图均衡,返回图像
def Histo(imagePath):
image = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
eq = cv2.equalizeHist(gray)
return eq
函数输入路径,输出图像,使用cv2.imshow("imgName",im)的方式显示
使用cv2.imshow()后要使用cv2.waitKey()函数保持图像。否则会卡死。
2.高斯模糊(滤波)
from scipy.ndimage import filters
im=array(Image.open(r'D:\xxxx\xxx').convert('L'))
im2=filters.gaussian_filter(im,5)
#5为δ,高斯函数的参数,越大越模糊
3.获取边缘
import math
#im2为灰度图
plt.figure()
plt.gray()
plt.contour(im2,origin='image')
plt.show()
4.x导数,y导数,梯度求导
from PIL import Image
import cv2
import numpy
import argparse
from scipy.ndimage import filters
import math
import matplotlib.pyplot as plt
from scipy.ndimage import filters
#x方向求导
def imx(im, sigma):
imgx = numpy.zeros(im.shape)
filters.gaussian_filter(im, sigma, (0, 1), imgx)
return imgx
#y方向求导
def imy(im, sigma):
imgy = numpy.zeros(im.shape)
filters.gaussian_filter(im, sigma, (1, 0), imgy)
return imgy
#梯度求导
def mag(im, sigma):
# there's also gaussian_gradient_magnitude()
#mag = numpy.sqrt(imgx**2 + imgy**2)
imgmag = 255 - numpy.sqrt(imgx ** 2 + imgy ** 2)
return imgmag
im = numpy.array(Image.open(r'D:/imgs/n01484850_95.JPEG').convert('L'))
plt.figure()
plt.gray()
imgx=imx(im,2)
imgy=imy(im,2)
#梯度求导时应先有imgx和imgy
imgmag=mag(im,2)
plt.subplot(1,3,1)
plt.imshow(imgx)
plt.subplot(1,3,2)
plt.imshow(imgy)
plt.subplot(1,3,3)
plt.imshow(imgmag)
plt.show()
5.ROF去噪
rof函数
from numpy import *
def denoise(im,U_init,tolerance=0.1,tau=0.125,tv_weight=100):
""" 使用A. Chambolle(2005)在公式(11)中的计算步骤实现Rudin-Osher-Fatemi(ROF)去噪模型
输入:含有噪声的输入图像(灰度图像)、U 的初始值、TV 正则项权值、步长、停业条件
输出:去噪和去除纹理后的图像、纹理残留"""
m,n = im.shape # 噪声图像的大小
# 初始化
U = U_init
Px = im # 对偶域的x 分量
Py = im # 对偶域的y 分量
error = 1
while (error > tolerance):
Uold = U
# 原始变量的梯度
GradUx = roll(U,-1,axis=1)-U # 变量U 梯度的x 分量
GradUy = roll(U,-1,axis=0)-U # 变量U 梯度的y 分量
# 更新对偶变量
PxNew = Px + (tau/tv_weight)*GradUx
PyNew = Py + (tau/tv_weight)*GradUy
NormNew = maximum(1,sqrt(PxNew**2+PyNew**2))
Px = PxNew/NormNew # 更新x 分量(对偶)
Py = PyNew/NormNew # 更新y 分量(对偶)
# 更新原始变量
RxPx = roll(Px,1,axis=1) # 对x 分量进行向右x 轴平移
RyPy = roll(Py,1,axis=0) # 对y 分量进行向右y 轴平移
DivP = (Px-RxPx)+(Py-RyPy) # 对偶域的散度
U = im + tv_weight*DivP # 更新原始变量
# 更新误差
error = linalg.norm(U-Uold)/sqrt(n*m);
return U,im-U # 去噪后的图像和纹理残余
2.对灰度图像去噪
im = numpy.array(Image.open(r'C:\Users\feiyu\Desktop\tmy.jpg').convert('L'))
U,T = A.denoise(im,im)
plt.figure()
plt.gray()
plt.imshow(U)
plt.show()
去噪后的测试灰度图像