数字图像处理-图像二维卷积函数

问题描述

实现一个函数 g = twodConv(f, w), 其中 f 是一个灰度源图像,w 是一个矩形卷积核。要求输出图像 g 与源图像 f 大小(也就是像素的行数和列数)一致。请注意,为满足这一要求,对于源图像f需要进行边界像素填补(padding)。这里请实现两种方案。第一种方案是像素复制,对应的选项定义为’replicate’,填补的像素拷贝与其最近的图像边界像素灰度。第二种方案是补零,对应的选项定义为’zero’, 填补的像素灰度为 0. 将第二种方案设置为缺省选择。

问题分析

卷积公式
w ( x , y ) ⋆ f ( x , y ) = ∑ s = − a s = a ∑ t = − b t = b f ( x − s , y − t ) w ( s , t ) w(x,y)\star f(x,y) = \sum_{s=-a}^{s=a}\sum_{t=-b}^{t=b}f(x-s,y-t)w(s,t) w(x,y)f(x,y)=s=as=at=bt=bf(xs,yt)w(s,t)
注意:卷积比相关操作多一个滤波核反转

代码实现

导库

import numpy as np
import cv2

卷积函数

def twodConv(f, w, method='zero'):
    w = np.array(w)
    #滤波核反转
    w = np.fliplr(np.flipud(w))
    print(w)
    x, y = w.shape
    fh, fw = f.shape
    nh = fh + x - 1
    nw = fw + y - 1
    add_h = int(x) // 2
    add_w = int(y) // 2
    #零填充边界
    n = np.zeros((nh, nw))
    g = np.zeros((fh, fw))
    #复制原图
    n[add_h:nh - add_h, add_w:nw - add_w] = f

    if method == 'replicate':
        # 边界填充
        n[0:add_h,add_w:nw-add_w] = f[0,:]
        n[nh-add_h:,add_w:nw-add_w] = f[-1,:]

        for i in range(add_w):
            n[:,i] = n[:,add_w]
            n[:,nw-1-i] = n[:,nw-1-add_w]
        # 卷积运算
        for i in range(fh):
            for j in range(fw):
                g[i,j] = np.sum(n[i:i+x,j:j+y] * w)
        g = g.clip(0,255)
        return g
    if method == 'zero':
        # 卷积运算
        for i in range(fh):
            for j in range(fw):
                g[i,j] = np.sum(n[i:i+x,j:j+y] * w)
        g = g.clip(0,255)
        return g
    else:
        raise Exception("输入格式有误")

主函数

if __name__ == '__main__':
    f = cv2.imread("cameraman.tif", cv2.IMREAD_GRAYSCALE)
    w = [[1,0,-1],[2,0,-2],[1,0,-1]]
    g1 = twodConv(f,w,method='replicate')
    g2 = twodConv(f,w)
    g3 = np.abs(g1 - g2)
    cv2.imshow('f', f)
    cv2.imshow('replicate', g1)
    cv2.imshow('zero', g2)
    cv2.imshow('diff', g3)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

运行结果

运行 twodConv.py 文件,滤波核以 sobel 算子为例,得到的卷积运算结果如下所示
在这里插入图片描述
通过做差的图也能看出两张图像的边缘部分不同。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
你好!对于数字图像处理中的锐化操作,C语言是一种常用的编程语言。在C语言中,可以使用一些算法和技术来实现图像的锐化效果。 一种常见的图像锐化方法是使用卷积运算,通过将原始图像一个合适的锐化滤波器进行卷积操作来增强图像的边缘和细节。常见的锐化滤波器包括拉普拉斯(Laplacian)、Sobel和Prewitt等。 在C语言中,可以使用像素级别的操作来实现图像锐化。首先,需要将图像加载到内存中,并将其表示为二维数组或指针。然后,使用循环遍历每个像素,并根据所选的锐化算法对其进行相应的处理。 以下是一个简单的示例代码,展示了如何使用C语言实现拉普拉斯滤波器进行图像锐化: ```c #include <stdio.h> // 图像宽度和高度 #define WIDTH 512 #define HEIGHT 512 // 拉普拉斯滤波器 int laplacianFilter[3][3] = { {-1, -1, -1}, {-1, 9, -1}, {-1, -1, -1} }; void sharpenImage(unsigned char* image) { unsigned char* result = malloc(WIDTH * HEIGHT * sizeof(unsigned char)); for (int y = 1; y < HEIGHT - 1; y++) { for (int x = 1; x < WIDTH - 1; x++) { int sum = 0; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { sum += laplacianFilter[i + 1][j + 1] * image[(y + i) * WIDTH + (x + j)]; } } result[y * WIDTH + x] = sum > 255 ? 255 : (sum < 0 ? 0 : sum); } } memcpy(image, result, WIDTH * HEIGHT * sizeof(unsigned char)); free(result); } int main() { // 加载图像数据到内存中 unsigned char* image = malloc(WIDTH * HEIGHT * sizeof(unsigned char)); // ... 从文件中读取图像数据到image数组 ... // 调用锐化函数 sharpenImage(image); // ... 将处理后的图像数据保存到文件 ... free(image); return 0; } ``` 请注意,此代码只是一个简单示例,实际应用中可能需要注意图像边界处理、内存管理和性能等方面的问题。希望这能帮助到你!如有任何疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值