python_developer
1.54K subscribers
3.74K photos
1.97K videos
232 files
434 links
کانال اموزش پایتون @Real_developer
تبلیغات پذیرفته میشود.
Download Telegram
فیلترهای پایین گذر و بالا گذر ایدال در حوزه فرکانس
کانولوشن در حوزه مکان معادل ضرب اسکالر در حوزه فرکانس است.
بنابراین، این محاسبات راحت است برای انجام کانولوشن در دامنه فرکانس به خصوص برای هسته کانولوشن بزرگ.
الگوریتم فیلتر کردن در دامنه فرکانس:
آ)تبدیل مرکزی تصویر را بر روی تصویر اصلی انجام دهید.
ب) تبدیل DFT را انجا م دهید.
ج) تغییر ضریب فوریه با توجه به فیلترینگ مورد نیاز
د) انجام تبدیل IDFT
ر) تبدیل مرکز ی تصویر را دوباره انجام دهید
(این اولین تبدیل مرکزی را خنثی می کند).

فيلتر پایین گذر ايده آل، تمامي ضرايب فوريه را كه دورتر از مرکز تصویر (W / 2، H / 2) نسبت به فاصله داده شده R هستن با چرخاندن آنها به صفر (W عرض تصویر و H ارتفاع تصویر است) تغيير مي دهد:
یک فیلتر بالا گذر ایده آل همه ضرایب فوریه که در فاصله کمتر از R از مرکز تصویر هستن را با تبدیل آنها به 0 را تغییر میدهد.
نتایج حاصل از فیلتر پایین گذر و فیلتر بالا گذر ایده آل در شکل زیر ارائه شده است.
فیلتر پایین گذر و بالا گذر گوسی حوزه فرکانس
🌟در ادامه میخواهیم حوزه فرکانس را به حوزه مکان تبدیل کنیم🌟
تصویر نمونه
ابتدا با قطعه کد زیر آن را به حوزه فرکانس میبریم:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('sib.jpg',0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
s1 = np.log(np.abs(fshift))
plt.subplot(121),plt.imshow(s1,'gray')
plt.title('Frequency Domain')
plt.axis("off")
plt.show()
💥فیلتر پایین گذر

💥فرمول فیلتر پایین گذر به شرح زیر است:
در حوزه فرکانسی، ما سعی می کنیم D0 متفاوت بگیریم و سپس آن را به حوزه مکانی تبدیل کنیم تا اثر را ببینیم:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('sib.jpg',0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
s1 = np.log(np.abs(fshift))
def make_transform_matrix(d,image):
transfor_matrix = np.zeros(image.shape)
center_point = tuple(map(lambda x:(x-1)/2,s1.shape))
for i in range(transfor_matrix.shape[0]):
for j in range(transfor_matrix.shape[1]):
def cal_distance(pa,pb):
from math import sqrt
dis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)
return dis
dis = cal_distance(center_point,(i,j))
if dis <= d:
transfor_matrix[i,j]=1
else:
transfor_matrix[i,j]=0
return transfor_matrix

d_1 = make_transform_matrix(10,fshift)
d_2 = make_transform_matrix(30,fshift)
d_3 = make_transform_matrix(50,fshift)
plt.subplot(131)
plt.axis("off")
plt.imshow(d_1,cmap="gray")
plt.title('D_1 10')
plt.subplot(132)
plt.axis("off")
plt.title('D_2 30')
plt.imshow(d_2,cmap="gray")
plt.subplot(133)
plt.axis("off")
plt.title("D_3 50")
plt.imshow(d_3,cmap="gray")
plt.show()
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('sib.jpg',0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
s1 = np.log(np.abs(fshift))
def make_transform_matrix(d,image):
transfor_matrix = np.zeros(image.shape)
center_point = tuple(map(lambda x:(x-1)/2,s1.shape))
for i in range(transfor_matrix.shape[0]):
for j in range(transfor_matrix.shape[1]):
def cal_distance(pa,pb):
from math import sqrt
dis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)
return dis
dis = cal_distance(center_point,(i,j))
if dis <= d:
transfor_matrix[i,j]=1
else:
transfor_matrix[i,j]=0
return transfor_matrix

d_1 = make_transform_matrix(10,fshift)
d_2 = make_transform_matrix(30,fshift)
d_3 = make_transform_matrix(50,fshift)
img_d1 = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_1)))
img_d2 = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_2)))
img_d3 = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_3)))
plt.subplot(131)
plt.axis("off")
plt.imshow(img_d1,cmap="gray")
plt.title('D_1 10')
plt.subplot(132)
plt.axis("off")
plt.title('D_2 30')
plt.imshow(img_d2,cmap="gray")
plt.subplot(133)
plt.axis("off")
plt.title("D_3 50")
plt.imshow(img_d3,cmap="gray")
plt.show()
در مورد فرآیند فوق، برای دریافت حوزه فرکانسی فیلتر پایین گذر کد مورد نظر به شرح زیر است:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('sib.jpg',0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
s1 = np.log(np.abs(fshift))

def lowPassFilter(image,d):
f = np.fft.fft2(image)
fshift = np.fft.fftshift(f)

def make_transform_matrix(d):
transfor_matrix = np.zeros(image.shape)
center_point = tuple(map(lambda x:(x-1)/2,s1.shape))
for i in range(transfor_matrix.shape[0]):
for j in range(transfor_matrix.shape[1]):
def cal_distance(pa,pb):
from math import sqrt
dis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)
return dis
dis = cal_distance(center_point,(i,j))
if dis <= d:
transfor_matrix[i,j]=1
else:
transfor_matrix[i,j]=0
return transfor_matrix
d_matrix = make_transform_matrix(d)
new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))
return new_img
plt.imshow(lowPassFilter(img,60),cmap="gray")
plt.show()