Une série d'étude du traitement d'image de base à partir de zéro (5).
Reportez-vous au tutoriel OpenCV-Python Livre de reconnaissance d'image https://www.amazon.co.jp/dp/4061529129/ Il s'agit d'une politique visant à promouvoir la compréhension du traitement qui est effectué dans.
Python 3.7.0 OpenCV 4.1.0 Jupyter Notebook
Appliquez une transformation de Fourier discrète 2D (DFT) aux images squelettes en échelle de gris. La zone blanche est concentrée au centre et contient de nombreux composants basse fréquence.
fourier.py
import cv2
import numpy as np
from matplotlib import pyplot as plt
from pylab import rcParams
%matplotlib inline
rcParams['figure.figsize'] = 25, 20
#Lire avec des niveaux de gris
img = cv2.imread('/brabra/1.jpg',0)
#Transformée de Fourier
f = np.fft.fft2(img)
#Changer le centre de l'image à l'origine
fshift = np.fft.fftshift(f)
#Le résultat de la conversion de Fourier étant un nombre complexe, il est défini sur une valeur absolue et transformé en journal.
magnitude_spectrum = 20*np.log(np.abs(fshift))
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()
Un filtre passe-haut (ne laissant que les composants haute fréquence) a été réalisé. Après la transformation de Fourier, les composants proches de l'origine sont filtrés dans une fenêtre rectangulaire et renvoyés à l'image.
highpass.py
rows, cols = img.shape
#Centre de l'image
crow,ccol = int(rows/2) , int(cols/2)
#Largeur près de l'origine à filtrer
reg = 50
#Filtre à partir de l'image de la transformée de Fourier
fshift[crow-reg:crow+reg, ccol-reg:ccol+reg] = 0
#Retour à l'image par transformation de Fourier inverse
f_ishift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.abs(img_back)
plt.subplot(131),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(img_back, cmap = 'gray')
plt.title('Image after HPF'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(img_back)
plt.title('Result in JET'), plt.xticks([]), plt.yticks([])
plt.show()
Il s'est avéré que le bord du squelette était resté.
Un filtre passe-bas (ne laissant que les composants basse fréquence) a été réalisé. Après la conversion de Fourier, il est traité de manière à ne laisser que le voisinage de l'origine et renvoyé à l'image.
lowpass.py
#Transformée de Fourier avec opencv
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
#Changement d'origine
dft_shift = np.fft.fftshift(dft)
#Valeur absolue,log
magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
rows, cols = img.shape
crow,ccol = int(rows/2) , int(cols/2)
#Largeur près de l'origine à laisser
fil2 = 20
#Fabrication de masques
mask = np.zeros((rows,cols,2),np.uint8)
mask[crow-fil2:crow+fil2, ccol-fil2:ccol+fil2] = 1
#Appliquer un masque sur l'éléphant transformé de Fourier
fshift = dft_shift*mask
#Retour à l'image par transformation de Fourier inverse
f_ishift = np.fft.ifftshift(fshift)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img_back, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()
Cette fois, les bords sont devenus plus minces. Ce qui ressemble à une vague près du bord est l'effet de sonnerie qui apparaît lorsque vous filtrez avec une fenêtre rectangulaire.
Nous avons effectué des transformées de Fourier sur des images, des filtres passe-haut et des filtres passe-bas pour approfondir notre compréhension.
--Traitement d'image avec OpenCV (tutoriel OpenCV-Python) http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_table_of_contents_imgproc/py_table_of_contents_imgproc.html#py-table-of-content-imgproc
Recommended Posts