import cv, numpy, math
def shiftDFTImage(dftre):
q1 = cv.GetSubRect( dftre, (0,0,dftre.cols/2, dftre.rows/2) )
q2 = cv.GetSubRect( dftre, (dftre.cols/2,0,dftre.cols/2,dftre.rows/2) )
q3 = cv.GetSubRect( dftre, (dftre.cols/2,dftre.rows/2,dftre.cols/2,dftre.rows/2) )
q4 = cv.GetSubRect( dftre, (0,dftre.rows/2,dftre.cols/2,dftre.rows/2) )
tmp = cv.CreateMat(dftre.rows/2,dftre.cols/2, dftre.type)
cv.Copy(q3, tmp);
cv.Copy(q1, q3);
cv.Copy(tmp, q1);
cv.Copy(q4, tmp);
cv.Copy(q2, q4);
cv.Copy(tmp, q2);
return dftre
def makegauss(rowsize, colsize, var = 1):
m = cv.GetOptimalDFTSize(rowsize-1)
n = cv.GetOptimalDFTSize(colsize-1)
g=cv.CreateMat(m, n, cv.CV_32FC1)
cv.SetZero(g)
i, j = m/2, n/2
for x in range(m/2):
for y in range(n/2):
x2 = math.pow(x, 2)
y2 = math.pow(y,2)
d =math.exp(-(x2+y2)/(2*var))
#d = 1
# 1.0/(2*math.pi*var)*math.exp(-(x2+y2)/(2*var))
cv.Set2D(g, i+x, j+y, cv.Scalar(d))
cv.Set2D(g, i-x, j+y, cv.Scalar(d))
cv.Set2D(g, i+x, j-y, cv.Scalar(d))
cv.Set2D(g, i-x, j-y, cv.Scalar(d))
"""m, M, ml, ML = cv.MinMaxLoc(g)
sx = M-m
cv.Scale(g, g, 1.0/sx, -1.0*m/sx)"""
print x, y, x2, y2, d
print rowsize, colsize
#g = shiftDFTImage(g)
print "exiting"
return g
def showMagnitudeImage(realimg, imagimg):
mimg = cv.CloneMat(realimg)
imimg = cv.CloneMat(imagimg)
cv.Pow(mimg, mimg, 2)
cv.Pow(imimg, imimg, 2)
cv.Add(mimg, imimg, mimg)
cv.Pow(mimg, mimg, 0.5)
cv.AddS(mimg, cv.ScalarAll(1.0), mimg, None)
cv.Log(mimg, mimg)
mimg = shiftDFTImage(mimg)
m, M, ml, ML = cv.MinMaxLoc(mimg)
sx = M-m
cv.Scale(mimg, mimg, 1.0/sx, -1.0*m/sx)
cv.NamedWindow("Magnitude Image")
cv.ShowImage("Magnitude Image", mimg)
cv.WaitKey(0)
im = numpy.asarray(imagimg)
re = numpy.asarray(realimg)
res = numpy.arctan2(im, re)
phimg = cv.CreateMat(realimg.rows, realimg.cols, cv.CV_32FC1)
phimg = cv.fromarray(phimg)
shiftDFTImage(phimg)
return mimg, phimg
def showPhaseImage(realimg, imagimg):
#mimg = cv.CloneMat(realimg)
#imimg = cv.CloneMat(imagimg)
phimg = cv.CloneMat(imagimg)
cv.Div(imagimg, realimg, phimg)
cv.AddS(phimg, cv.ScalarAll(1.0), phimg, None)
cv.Log(phimg, phimg)
phimg = shiftDFTImage(phimg)
m, M, ml, ML = cv.MinMaxLoc(phimg)
sx = M-m
cv.Scale(phimg, phimg, 1.0/sx, -1.0*m/sx)
cv.NamedWindow("Phase Image")
cv.ShowImage("Phase Image", phimg)
cv.WaitKey(0)
return phimg
def gaussianinv(magimg, phimg):
realimg = cv.CloneMat(phimg)
imagimg = cv.CloneMat(phimg)
resimg = cv.CloneMat(phimg)
temp = numpy.asarray(phimg)
rtemp = cv.fromarray(numpy.cos(temp*numpy.pi/180))
cv.Mul(magimg, rtemp, realimg)
rtemp = cv.fromarray(numpy.sin(temp*numpy.pi/180))
cv.Mul(magimg, rtemp, imagimg)
cv.Mul(cv.Pow(realimg, 2), cv.Pow(imagimg, 2), resimg)
return resimg
img = cv.LoadImageM("b.tif", 0)
#m = cv.GetOptimalSize()
imreal = cv.CreateMat(img.rows, img.cols, cv.CV_32FC1)
imimag = cv.CreateMat(img.rows, img.cols, cv.CV_32FC1)
comp = cv.CreateMat(img.rows, img.cols, cv.CV_32FC2)
cv.Scale(img, imreal, 1.0, 0.0)
d = (500)**2
H = makegauss(img.rows, img.cols, d)
#cv.Mul(H, imreal, imreal)
#cv.Copy(img, imreal)
cv.NamedWindow("original")
cv.ShowImage("original", img)
cv.WaitKey(0)
cv.Zero(imimag)
cv.Merge(imreal, imimag, None, None, comp)
m = cv.GetOptimalDFTSize(img.rows-1)
n = cv.GetOptimalDFTSize(img.cols-1)
dfta = cv.CreateMat(m,n, cv.CV_32FC2)
dftre = cv.CreateMat(m,n, cv.CV_32FC1)
dftim = cv.CreateMat(m,n, cv.CV_32FC1)
dftdup= cv.CreateMat(m,n, cv.CV_32FC2)
temp = cv.CreateMat(img.rows,img.cols,cv.CV_32FC2)
#rect =
temp = cv.GetSubRect(dfta, (0 , 0 , img.cols, img.rows) )
cv.Copy(comp, temp)
if dfta.cols>img.cols:
temp = cv.GetSubRect(dfta, (img.cols, 0, dfta.cols-img.cols,img.rows))
cv.Zero(temp)
cv.DFT(dfta, dfta, cv.CV_DXT_FORWARD, img.rows)
#cv.Copy(dfta, dftdup)
cv.Split(dfta, dftre, dftim, None,None)
#showMagnitudeImage(dftre, dftim)
#H = shiftDFTImage(H)
#cv.MulSpectrums(dftre, H, dftre, cv.CV_DXT_ROWS)
#cv.ShowImage("before", dftre)
magimg, phimg = showMagnitudeImage(dftre, dftim)
#d = ((500/2)**2 +(500/2))**2
#H = makegauss(img.rows, img.cols, d)
#phimg = showPhaseImage(dftre, dftim)
#cv.SetZero(H)
cv.Mul(H, magimg, magimg)
cv.ShowImage("original", magimg)
#showMagnitudeImage(H)
#shiftDFTImage(dftre)
#cv.ShowImage("after", dftre)
"""cv.Mul(dftre, phimg, dftim)
cv.Merge(dftre, dftim, None, None, dfta)
cv.DFT(dfta, dfta, cv.CV_DXT_INV_SCALE, dfta.rows)
"""
#cv.Split(dfta, dftre, dftim, None, None)
cv.WaitKey(0)
gaussianinv(magimg, phimg)
cv.DFT(dfta, dfta, cv.CV_DXT_INV_SCALE, img.rows)
dftconv = cv.CreateMat(dfta.rows, dfta.cols, img.type)
cv.Scale(dfta, dftconv, 255.0, 0)
cv.NamedWindow("Gaussian")
cv.ShowImage("Gaussian", dftconv)
cv.WaitKey(0)
#showMagnitudeImage(dftre, dftim)
cv.WaitKey(0)