图像的增强之空域增强
import cv2 as cv
import numpy as np
# 图像空域增强的方法(主要针对灰度图像)
img = cv.imread("./img.png", cv.IMREAD_GRAYSCALE)
# 1、灰度变换增强
# 用于使图像对比度扩展,从而改善图像质量,凸显图像的细节
# 有三种方法:线性灰度变换、分段线性灰度变换、非线性灰度变换
# 线性灰度变换
# 使用公式Gb = αGa + b,Ga为图像原始的灰度值,Gb为变换后的灰度值
# 当α>1时,变换后的图像对比度增强
# 当α=1,b!=0时,图像灰度值上移或者下移
# 当0<α<1时,变换后的图像对比度减小
# 当α=-1,b=255时,图像的灰度值反转
img_linear = img
rows, cols = img.shape
for i in range(rows):
for j in range(cols):
# 对比度增强
img_linear[i, j] = int(1.5*img_linear[i, j])
if img_linear[i, j] > 255:
img_linear[i, j] = 255
img_linear = np.uint8(img_linear)
# 分段线性灰度变换
img_piece_linear = img
rows, cols = img.shape
for i in range(rows):
for j in range(cols):
if img_piece_linear[i, j] < 50:
# 灰度值范围在[0, 50)的对比度增强
img_piece_linear[i, j] = int(1.5*img_piece_linear[i, j])
elif 50 <= img_piece_linear[i, j] <= 200:
# 灰度值范围在[50, 200]的对比度降低
img_piece_linear[i, j] = int(0.5 * img_piece_linear[i, j])
# 灰度值范围在(200, 255]的进行灰度值上移
elif 200 < img_piece_linear[i, j] < 250:
img_piece_linear[i, j] = img_piece_linear[i, j] + 20
if img_piece_linear[i, j] > 255:
img_piece_linear[i, j] = 255
img_piece_linear = np.uint8(img_piece_linear)
# 非线性灰度变换
# 幂次变换,其它的类似
img_power = img
rows, cols = img.shape
c = 1
γ = 2.2
for i in range(rows):
for j in range(cols):
img_power[i, j] = int(c*pow(img_power[i, j], γ))
img_power = np.uint8(img_power)
# 2、直方图变换增强
# 一个重要的计算灰度值的函数cv.calcHist(),返回图像的一个包含各个灰度值的数量的255×1的矩阵
img_hist_equal = cv.equalizeHist(img)
# 3、空域滤波增强
# 邻域滤波(分为加权和不加权两种)
# 第一种为不加权邻域滤波,这里使用一个3×3的全一数组作为窗口
# 图像经处理后某一点的像素值为原来该点所在窗口中的所有像素点的均值
img_blur = cv.blur(img, (3, 3))
# 第二种为加权邻域滤波,这里也使用一个3×3的数组作为窗口,
# 不同的是,这个数组中的值可以有不同的权值。
# 某一点的像素值为原来该点所在窗口中的所有像素点加权后的均值
kernel = np.array([[1, 2, 1], [2, 4, 2], [1, 2, 1]])
img_weight_blur = cv.filter2D(img, -1, kernel)
# 中值滤波
# 使用一个大小为3的窗口,图像经处理后某一点的值为原来这个图像在窗口内所有值的中值
img_median_blur = cv.medianBlur(img, 3)
# 高斯滤波
# 作用原理和均值滤波器类似,都是取滤波器窗口内的像素的均值作为输出。
# 只是其窗口模板的系数和均值滤波器不同,均值滤波器的模板系数都是相同的为1。
# 高斯滤波器的模板系数,则随着距离模板中心的增大而系数减小。
img_gaussian_blur = cv.GaussianBlur(img, (3, 3), 0)