实现目标:
实现空间域图像增强方法中的梯度锐化算法。
代码如下:
"""
Created on 2023/3/21 08:32
@author: liuwenq
实验一_空间域图像增强方法_梯度锐化算法
"""
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
import matplotlib
import warnings
warnings.filterwarnings("ignore")
class Arth():
Grad = 0
Roberts = 1
Prewitt = 2
Sobel = 3
def my_grad(img, method, T=50):
"""
梯度锐化算法
:param img:输入的灰度图像
:param method:不同的算子
:param T:梯度阈值,默认=50
"""
h, w = img.shape[:2]
new_img = np.zeros((h, w), dtype=np.uint8)
for i in range(h - 1): # 梯度算子和Roberts算子都需要用到后一个像素,所以只算到第(h-1,w-1)个像素
for j in range(w - 1):
# 梯度算子
if method == Arth.Grad:
grad = abs(int(img[i, j + 1]) - int(img[i, j])) + abs(int(img[i + 1, j]) - int(img[i, j])) # 梯度计算公式
new_img[i, j] = 255 if grad >= T else 0 # 利用阈值T将图像划分为二值图像
# Roberts算子
if method == Arth.Roberts: # Roberts算子为[[-1,0],[0,-1]] [[0,-1],[1,0]]
grad = abs(int(img[i + 1, j + 1]) - int(img[i, j])) + abs(int(img[i + 1, j]) - int(img[i, j + 1]))
print(grad)
new_img[i, j] = 255 if grad >= T else 0 # 利用阈值T将图像划分为二值图像
for i in range(h - 2): # Prewitt算子和Sobel算子计算都要用到后两行两列,所以i从0到(h-2),j从0到(w-2)
for j in range(w - 2):
# Prewitt算子
if method == Arth.Prewitt:
f_y = sum(img[i:i + 3, j:j + 3][2]) - sum(img[i:i + 3, j:j + 3][0]) # 第二行减第一行像素和
f_x = sum(img[i:i + 3, j:j + 3][:, 2]) - sum(img[i:i + 3, j:j + 3][:, 0]) # 第二列减第一列像素和
grad = abs(f_y) + abs(f_x)
new_img[i, j] = 255 if grad >= T else 0 # 利用阈值T将图像划分为二值图像
# Sobel算子
if method == Arth.Sobel:
f_y = sum(img[i:i + 3, j:j + 3][2]) - sum(img[i:i + 3, j:j + 3][0]) \
+ img[i + 2, j + 1] - img[i, j + 1] # 根据sobel算子,第三行减第一行像素和后再加一遍img[i + 2, j + 1] - img[i, j + 1]
f_x = sum(img[i:i + 3, j:j + 3][:, 2]) - sum(img[i:i + 3, j:j + 3][:, 0]) \
+ img[i + 1, j + 2] - img[i + 1, j] # 根据sobel算子,第三列减第一列像素和后再加一遍img[i + 1, j + 2] - img[i + 1, j]
grad = abs(f_y) + abs(f_x)
new_img[i, j] = 255 if grad >= T else 0 # 利用阈值T将图像划分为二值图像
return new_img
# 读入图像
src = cv.imread("E:/11.PNG", 0) # 以灰度图像读入
img = src.copy()
# 设置字体为楷体
matplotlib.rcParams['font.sans-serif'] = ['KaiTi']
Grad_img = my_grad(img, Arth.Grad, 50)
Roberts_img = my_grad(img, Arth.Roberts, 50)
Prewitt_img = my_grad(img, Arth.Prewitt, 70)
Sobel_img = my_grad(img, Arth.Sobel, 70)
# 显示图像
matplotlib.rcParams['font.sans-serif'] = ['KaiTi']
plt.figure(figsize=(10, 8), dpi=200)
plt.suptitle("锐化滤波器",fontsize=30,x=0.5,y=0.05)
plt.subplot(131)
plt.imshow(src, cmap=plt.cm.gray)
plt.title("原图",fontsize=18)
plt.subplot(232)
plt.imshow(Grad_img, cmap=plt.cm.gray)
plt.title("梯度算子",fontsize=18)
plt.subplot(233)
plt.imshow(Roberts_img, cmap=plt.cm.gray)
plt.title("Roberts算子",fontsize=18)
plt.subplot(235)
plt.imshow(Prewitt_img, cmap=plt.cm.gray)
plt.title("Prewitt算子",fontsize=18)
plt.subplot(236)
plt.imshow(Sobel_img, cmap=plt.cm.gray)
plt.title("Sobel算子",fontsize=18)
plt.show()
实现效果: