merve's picture
merve HF Staff
Update app.py
33f3621
Raw History Blame Contribute Delete
3.55 kB
import streamlit as st
import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack as fp
import cv2
from PIL import Image
# ideal filter
def ideal_filter(rows, cols, D0, filtr):
H = np.zeros(shape = (rows, cols))
for i in range(rows):
for j in range(cols):
# euclidean distance from u,v to origin of frequency
Duv = np.sqrt(np.power(i - rows/2, 2) + np.power(j - cols/2, 2))
if Duv < D0:
H[i,j] = 1.0
if filtr == "High Pass":
H = 1-H
#H = H*255
cv2.imwrite('filter.jpg',np.abs(H*255))
return H
def butterworth_filter(rows, cols, n_order, D0, filtr):
H = np.zeros(shape = (rows, cols))
for i in range(rows):
for j in range(cols):
Duv = np.sqrt(np.power(i - rows/2, 2) + np.power(j - cols/2, 2))
H[i,j] = 1/(1+((Duv/D0)**(2*n_order)))
if filtr == "High Pass":
H = 1-H
cv2.imwrite('filter.jpg',np.abs(H*255))
return H
def gaussian_filter(rows, cols, filtr):
H = np.zeros(shape = (rows, cols))
for i in range(rows):
for j in range(cols):
Duv = np.sqrt(np.power(i - rows/2, 2) + np.power(j - cols/2, 2))
H[i,j] = np.exp(-((Duv**2)/(2*(D0**2))))
if filtr == "High Pass":
H = 1-H
#H = H*255
cv2.imwrite('filter.jpg',np.abs(H*255))
return H
def calculate_distance(rows, cols):
dist =np.zeros((rows,cols))
u=np.arange(0, rows, 1)
v=np.arange(0, cols, 1)
for i in range(rows):
for j in range(cols):
dist[i,j]=np.sqrt(((u[i]-rows/2)**2)+((v[j]-cols/2)**2))
dist = np.float32(dist)
return dist
if __name__ == "__main__":
#image = Image.open(file).convert("L")
st.set_option('deprecation.showPyplotGlobalUse', False)
uploaded_file = st.sidebar.file_uploader("Upload image", type = ["jpeg", "jpg", "png"])
filtr = st.sidebar.radio("Filters", ("Low Pass", "High Pass"))
kernel = st.sidebar.radio("Kernels", ("Ideal", "Butterworth", "Gaussian"))
D0 = st.sidebar.slider("Cutoff Frequency", min_value = 0, max_value = 120)
n_order = st.sidebar.number_input(label = "Order", min_value = 0, max_value = 5)
if uploaded_file is not None:
img = Image.open(uploaded_file)
img.save("read_image.jpg")
st.subheader("Source Image")
st.image("read_image.jpg", width = 300)
img = cv2.imread("read_image.jpg", 0)
rows, cols = img.shape
if kernel == "Ideal":
k = ideal_filter(rows, cols, D0, filtr)
elif kernel == "Gaussian":
k = gaussian_filter(rows, cols, filtr)
elif kernel == "Butterworth":
k = butterworth_filter(rows, cols, n_order, D0, filtr)
H = fp.fft2(fp.ifftshift(k)) # fast fourier transform
f_img = fp.fft2(img) # fast fourier transform
conv_img = np.multiply(H, f_img)
inv_img = fp.ifft2(conv_img).real
output_img = ((inv_img - np.min(inv_img))/np.max(inv_img))*255
#output_img = fp.ifft2(conv_img)
cv2.imwrite('output_image.jpg',output_img)
st.subheader(f"Target Image with {filtr} {kernel} Filter, and Filter itself")
st.image(["filter.jpg", "output_image.jpg"], width = 320)
dist = calculate_distance(rows, cols)
st.subheader("Graph of Distance against Function")
plt.plot(dist.ravel(), k.ravel())
plt.xlabel('Distance from the Center')
plt.ylabel('Filter Function')
st.pyplot()