学习笔记—使用Python运用Sobel算子,Laplacian算子和高通滤波算子对图像进行锐化

import cv2 as cv
from pylab import *
import matplotlib.pyplot as plt
import random
from scipy import ndimage
import numpy
# .......................................................................................
# ..................................我是分界线.............................................
# .......................................................................................
def LaplaceOperator(roi):
    laplace_operator = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
    result = np.abs(np.sum(roi * laplace_operator))  # 3阶矩阵相乘并求和取绝对值
    return result

def LaplaceAlogrithm(image):
    new_image = np.zeros(image.shape)                                # 返回来一个给定形状和类型的用0填充的数组,用于储存新图像
    image = cv.copyMakeBorder(image, 1, 1, 1, 1, cv.BORDER_DEFAULT)  # 为图片设置边界框
    # image.shape[0]图片垂直尺寸;image.shape[1]图片水平尺寸;image.shape[2]图片通道数
    for i in range(1, image.shape[0] - 1):
        for j in range(1, image.shape[1] - 1):
            new_image[i - 1, j - 1] = LaplaceOperator(image[i - 1:i + 2, j - 1:j + 2])
    # 上面这个for循环 是 拿出3x3的图像像素与卷积核相乘,然后存放到个新的数组中
    new_image = new_image * (255 / np.max(image))  # 防止有灰度值超过255这个数值
    return new_image.astype(np.uint8)              # 转换数组的数据类型
# .......................................................................................
# ..................................我是分界线.............................................
# .......................................................................................
def pepper_and_salt(img,percentage):
    num=int(percentage*img.shape[0]*img.shape[1])#  椒盐噪声点数量
    random.randint(0, img.shape[0])
    img2=img.copy()
    for i in range(num):
        X=random.randint( 0,img2.shape[0]-1)  #从0到图像长度之间的一个随机整数,因为是闭区间所以-1
        Y=random.randint( 0,img2.shape[1]-1)
        if random.randint(0,1) ==0:          #黑白色概率55开
            img2[X,Y] = (255,255,255)        #白色
        else:
            img2[X,Y] =(0,0,0)#黑色
    return img2
# ..................................我是分界线.............................................

if __name__ == '__main__':

       plt.ion()     #人机交互界面启动
       # 读取图片

       img = cv.imread("g11.tif")
       # 使用3*3的Sobel算子进行图像锐化
       x = cv.Sobel(img, cv.CV_16S, 1, 0)  # 1,0表示计算X方向的导数
       y = cv.Sobel(img, cv.CV_16S, 0, 1)  # 1,0表示计算Y方向的导数
       #cv.CV_16S表示图像深度,这是为了防止溢出,当输入图像是8位的,要求输出图像是16位的

       absX = cv.convertScaleAbs(x)                   # 转回uint8
       absX = cv.addWeighted(absX, 0.5, img, 0.5, 0)  # 将原图与sobel算法(X轴求导)处理过的图片结果相加
       absY = cv.convertScaleAbs(y)                   # 转回uint8
       absY = cv.addWeighted(absY, 0.5, img, 0.5, 0)  # 将原图与sobel算法(Y轴求导)处理过的图片结果相加
       dst  = cv.addWeighted(absX, 0.5, img, 0.5, 0)  # 将sobel算法(对X求导)(对Y求导)处理过的图片相加
       dst  = cv.addWeighted(dst , 0.5, img, 0.5, 0)  # 将原图和上一段代码生成的图片相加
       htitch = np.hstack((absX,absY,dst))            # 合并3张图片
       cv.imshow("absX-absY-dst", htitch)             # 图片显示
       cv.waitKey(0)
       cv.destroyAllWindows()

       # 使用3*3的Laplacian算子进行图像锐化
       img = cv.imread("g13.tif")         # 导入图片
       plt.subplot()                      # 生成一个用于图片显示的窗口
       plt.title("Laplacian")             # 标题
       plt.imshow(LaplaceAlogrithm(img))  # 对图像调用函数先进行拉普拉斯变换后显示
       plt.pause(3)                       # 延时三秒
       plt.close()                        # 清空窗口
       dst = cv.addWeighted(LaplaceAlogrithm(img), 0.5, img, 0.5, 0)  # 将原图和拉普拉斯变换生成的图片相加
       cv.imshow("over", dst)                                         # 图片显示
       cv.waitKey(5000)                                               # 图片显示延时5000帧

       # 使用3*3的高通滤波算子进行图像锐化
       img = cv.imread("g14.tif")                                # 导入图片
       kernel = np.array([[0, -2, 0], [-2, 9, -2], [0, -2, 0]])  # 生成二维梯度模板矩阵
       gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)                # 将图片变为CV格式的灰度图,我这不加这句话会报错
       G14 = cv.filter2D(gray,-1,kernel)                         # gray表示输入图像;-1表示目标图像和原图像深度保持一致;kernel为卷积核
       dst = cv.addWeighted(gray, 0.5, G14, 0.5, 0)              # 将高通滤波后的图与原图叠加
       cv.imshow("gaotong", G14)                                 # 显示高通滤波后的图片
       cv.imshow("over", dst)                                    # 显示叠加后的图
       cv.waitKey()




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值