图像处理——实现梯度锐化算法

实现目标:

实现空间域图像增强方法中的梯度锐化算法

代码如下:

"""
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()

实现效果:

图像处理——实现梯度锐化算法_第1张图片 

你可能感兴趣的:(图像处理与计算机视觉,计算机视觉,python,opencv,图像处理)