图像的空间卷积滤波(image spatialconvolution)

时域卷积(spatialconvolution)

对图像做时域滤波,其数学原理就是:原图像和卷积核(kernel)做卷积运算,因此我们第一个要实现的函数就是时域卷积。

第一步:Flip filter kernel

i)原理

在这个地方我写作业的时候,就出现了问题,因为之前我对卷积核翻转180度的实现有误解。通过查阅资料我了解到,将卷积核也就是一个矩阵翻转180度有两种程序上的实现方法:

  1. 原矩阵记作M, 旋转180度后的矩阵记作m,i,j 分别表示行号和列号,rows,cols分别表示原矩阵的行数和列数,新矩阵m可表示成:
    m[i][j] = M[rows-i-1][cols-j-1]
  2. 将原矩阵做水平和垂直翻转,亦可实现旋转180度的效果

ii)代码实现

a)通过转换公式实现

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import numpy as np;
import cv2
#This function determines the matrix rotation
#model decides the rotation derection:
#   model = 1 := rotation 180(clockweise) 
#   TODO: compare the rotation 90 degree with flip horizontal
def rotation(M,model):
    m = np.copy(M)
    rows = M.shape[0]
    cols = M.shape[1]
    if model == 1:
        for i in range(rows):
            for j in range(cols):
                m[i][j] = M[rows-1-i][cols-1-j]
    else:
        print("Error! model is not support")
        return -1
                
    return m

A = np.arange(1,10)
A = A.reshape(3,3)

A_rot = rotation(A,1)
#图像水平垂直翻转
A_flip = cv2.flip(A,-1)

print(A)
print(A_rot)
print(A_flip)
[[1 2 3]
 [4 5 6]
 [7 8 9]]
[[9 8 7]
 [6 5 4]
 [3 2 1]]
[[9 8 7]
 [6 5 4]
 [3 2 1]]

从输出结果上可以看出,这两个程序上的对矩阵旋转的实现,效果是一致的。

Note:
已经有一个星期没有写python了,第一次写的时候出现了很多错误,这里记录下,提醒自己:
1)
for i in rows:
TypeError: 'int' object is not iterable
这个错误,就是在写for循环的时候,rows必须是可迭代的数据结构,修改为:
for i in range(rows):
2)
在写if-else的时候,只考虑了条件成立的情况,忽略了else的情况,这里加上else的情况是一种良好的编程习惯。
3)
TODO:希望自己以后能深入的理解python的for循环与c语言的for循环的区别,如果python的for循环不想从i=0开始,该怎么办呢?

http://vinnyxiong.cn/blog/在Xcode中为main函数设置输入参数.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容