我一直在尝试按照“数字图像处理”(Gonzales和Woods)一书中的示例程序进行操作。该过程是通过对图像进行傅立叶变换并将其与H(u,v)相乘并最终进行逆傅里叶变换来降低和模糊图像。
这是我到目前为止所得到的:
from __future__ import division
import cv2
import numpy as np
import scipy as sp
import math
from scipy.signal import convolve2d
img = cv2.imread('book_cover.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
xSize, ySize = gray_img.shape
def applyFilter(img, func):
image = np.copy(img)
# Construct image from blurring function
for u in xrange(0,ySize):
for v in xrange(0,xSize):
image[u,v] = func(u,v)
# Performe the actual blurring of the image. Not working as expected
return image*img
def blurr(y,x):
a = 0.05
b = 0.05
T = 1
C = math.pi*(a*y+b*x)
if(C == 0):
return 1
return (T/C)*math.sin(C)*math.e**(-1j*C)
def toReal(img):
realImg = np.zeros(img.shape)
for i in xrange(0,img.shape[0]):
for j in xrange(0,img.shape[1]):
realImg[i,j] = np.absolute(img[i,j])
return realImg
def normalize(image):
img = image.copy()
img = toReal(img)
img -= img.min()
img *= 255.0/img.max()
return img.astype(np.uint8)
f = np.fft.fft2(gray_img.astype(np.int32))
fft_img = np.fft.fftshift(f)
# Apply the blurring filter
filtered_fft = applyFilter(fft_img, blurr)
f_fft_img = np.fft.ifftshift(filtered_fft)
filtered_img = np.fft.ifft2(f_fft_img)
filtered_img = normalize(filtered_img)
cv2.imwrite('book_cover_blurred.jpg', filtered_img.astype(np.uint8))
左边的两本书封面取自书本,最左边的是原始图像,中间的是被过滤的。最右边的那个是我用上面代码得到的结果。 Link to images
我肯定误会了什么,但我完全失去了。
答案 0 :(得分:1)
我发现了我最后犯的错误。我通过实施H(u,v)而不是正确的H(u-M / 2,v-N / 2)犯了一个愚蠢的错误。