时域卷积(spatialconvolution)
对图像做时域滤波,其数学原理就是:原图像和卷积核(kernel)做卷积运算,因此我们第一个要实现的函数就是时域卷积。
第一步:Flip filter kernel
i)原理
在这个地方我写作业的时候,就出现了问题,因为之前我对卷积核翻转180度的实现有误解。通过查阅资料我了解到,将卷积核也就是一个矩阵翻转180度有两种程序上的实现方法:
- 原矩阵记作M, 旋转180度后的矩阵记作m,i,j 分别表示行号和列号,rows,cols分别表示原矩阵的行数和列数,新矩阵m可表示成:
m[i][j] = M[rows-i-1][cols-j-1] - 将原矩阵做水平和垂直翻转,亦可实现旋转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