def createNotchFilter(self, dia1, dia2=None, cen=None, size=(64, 64), type="lowpass"): """ **SUMMARY** Creates a disk shaped notch filter of given diameter at given center. **PARAMETERS** * *dia1* - int - diameter of the disk shaped notch - list - provide a list of three diameters to create a 3 channel filter * *dia2* - int - outer diameter of the disk shaped notch used for bandpass filter - list - provide a list of three diameters to create a 3 channel filter * *cen* - tuple (x, y) center of the disk shaped notch if not provided, it will be at the center of the filter * *size* - size of the filter (width, height) * *type*: - lowpass or highpass filter **RETURNS** DFT notch filter **EXAMPLE** >>> notch = DFT.createNotchFilter(dia1=200, cen=(200, 200), size=(512, 512), type="highpass") >>> notch = DFT.createNotchFilter(dia1=200, dia2=300, cen=(200, 200), size=(512, 512)) >>> img = Image('lenna') >>> notch.applyFilter(img).show() """ if isinstance(dia1, list): if len(dia1) != 3 and len(dia1) != 1: warnings.warn("diameter list must be of size 1 or 3") return None if isinstance(dia2, list): if len(dia2) != 3 and len(dia2) != 1: warnings.warn("diameter list must be of size 3 or 1") return None if len(dia2) == 1: dia2 = [dia2[0]] * len(dia1) else: dia2 = [dia2] * len(dia1) if isinstance(cen, list): if len(cen) != 3 and len(cen) != 1: warnings.warn("center list must be of size 3 or 1") return None if len(cen) == 1: cen = [cen[0]] * len(dia1) else: cen = [cen] * len(dia1) stackedfilter = DFT() for d1, d2, c in zip(dia1, dia2, cen): stackedfilter = stackedfilter._stackFilters( self.createNotchFilter(d1, d2, c, size, type)) image = Image(stackedfilter._numpy) retVal = DFT(numpyarray=stackedfilter._numpy, image=image, dia=dia1 + dia2, channels=len(dia1), size=size, type=stackedfilter._type, frequency=stackedfilter._freqpass) return retVal w, h = size if cen is None: cen = (w / 2, h / 2) a, b = cen y, x = np.ogrid[-a:w - a, -b:h - b] r = dia1 / 2 mask = x * x + y * y <= r * r flt = np.ones((w, h)) flt[mask] = 255 if type == "highpass": flt = 255 - flt if dia2 is not None: a, b = cen y, x = np.ogrid[-a:w - a, -b:h - b] r = dia2 / 2 mask = x * x + y * y <= r * r flt1 = np.ones((w, h)) flt1[mask] = 255 flt1 = 255 - flt1 flt = flt + flt1 np.clip(flt, 0, 255) type = "bandpass" img = Image(flt) notchfilter = DFT(size=size, numpyarray=flt, image=img, dia=dia1, type="Notch", frequency=type) return notchfilter
def createBandpassFilter(self, xCutoffLow, xCutoffHigh, yCutoffLow=None, yCutoffHigh=None, size=(64, 64)): """ **SUMMARY** Creates a banf filter of given size and order. **PARAMETERS** * *xCutoffLow* - int - horizontal lower cut off frequency - list - provide a list of three cut off frequencies * *xCutoffHigh* - int - horizontal higher cut off frequency - list - provide a list of three cut off frequencies * *yCutoffLow* - int - vertical lower cut off frequency - list - provide a list of three cut off frequencies * *yCutoffHigh* - int - verical higher cut off frequency - list - provide a list of three cut off frequencies to create a 3 channel filter * *size* - size of the filter (width, height) **RETURNS** DFT filter. **EXAMPLE** >>> flt = DFT.createBandpassFilter(xCutoffLow=75, xCutoffHigh=190, size=(320, 280)) >>> flt = DFT.createBandpassFilter(xCutoffLow=[75], xCutoffHigh=[190], size=(320, 280)) >>> flt = DFT.createBandpassFilter(xCutoffLow=[75, 120, 132], xCutoffHigh=[190, 210, 234], size=(320, 280)) >>> flt = DFT.createBandpassFilter(xCutoffLow=75, xCutoffHigh=190, yCutoffLow=60, yCutoffHigh=210, size=(320, 280)) >>> flt = DFT.createBandpassFilter(xCutoffLow=[75], xCutoffHigh=[190], yCutoffLow=[60], yCutoffHigh=[210], size=(320, 280)) >>> flt = DFT.createBandpassFilter(xCutoffLow=[75, 120, 132], xCutoffHigh=[190, 210, 234], yCutoffLow=[70, 110, 112], yCutoffHigh=[180, 220, 220], size=(320, 280)) >>> img = Image('lenna') >>> flt.applyFilter(img).show() """ lowpass = self.createLowpassFilter(xCutoffLow, yCutoffLow, size) highpass = self.createHighpassFilter(xCutoffHigh, yCutoffHigh, size) lowpassnumpy = lowpass._numpy highpassnumpy = highpass._numpy bandpassnumpy = lowpassnumpy + highpassnumpy bandpassnumpy = np.clip(bandpassnumpy, 0, 255) img = Image(bandpassnumpy) bandpassFilter = DFT(size=size, image=img, numpyarray=bandpassnumpy, type="bandpass", xCutoffLow=xCutoffLow, yCutoffLow=yCutoffLow, xCutoffHigh=xCutoffHigh, yCutoffHigh=yCutoffHigh, frequency="bandpass", channels=lowpass.channels) return bandpassFilter
def createLowpassFilter(self, xCutoff, yCutoff=None, size=(64, 64)): """ **SUMMARY** Creates a lowpass filter of given size and order. **PARAMETERS** * *xCutoff* - int - horizontal cut off frequency - list - provide a list of three cut off frequencies to create a 3 channel filter * *yCutoff* - int - vertical cut off frequency - list - provide a list of three cut off frequencies to create a 3 channel filter * *size* - size of the filter (width, height) **RETURNS** DFT filter. **EXAMPLE** >>> flt = DFT.createLowpassFilter(xCutoff=75, size=(320, 280)) >>> flt = DFT.createLowpassFilter(xCutoff=[75], size=(320, 280)) >>> flt = DFT.createLowpassFilter(xCutoff=[75, 100, 120], size=(320, 280)) >>> flt = DFT.createLowpassFilter(xCutoff=75, yCutoff=35, size=(320, 280)) >>> flt = DFT.createLowpassFilter(xCutoff=[75], yCutoff=[35], size=(320, 280)) >>> flt = DFT.createLowpassFilter(xCutoff=[75, 100, 125], yCutoff=35, size=(320, 280)) >>> # yCutoff will be [35, 35, 35] >>> flt = DFT.createLowpassFilter(xCutoff=[75, 113, 124], yCutoff=[35, 45, 90], size=(320, 280)) >>> img = Image('lenna') >>> flt.applyFilter(img).show() """ if isinstance(xCutoff, list): if len(xCutoff) != 3 and len(xCutoff) != 1: warnings.warn("xCutoff list must be of size 3 or 1") return None if isinstance(yCutoff, list): if len(yCutoff) != 3 and len(yCutoff) != 1: warnings.warn("yCutoff list must be of size 3 or 1") return None if len(yCutoff) == 1: yCutoff = [yCutoff[0]] * len(xCutoff) else: yCutoff = [yCutoff] * len(xCutoff) stackedfilter = DFT() for xfreq, yfreq in zip(xCutoff, yCutoff): stackedfilter = stackedfilter._stackFilters( self.createLowpassFilter(xfreq, yfreq, size)) image = Image(stackedfilter._numpy) retVal = DFT(numpyarray=stackedfilter._numpy, image=image, xCutoffLow=xCutoff, yCutoffLow=yCutoff, channels=len(xCutoff), size=size, type=stackedfilter._type, order=self._order, frequency=stackedfilter._freqpass) return retVal w, h = size xCutoff = np.clip(int(xCutoff), 0, w / 2) if yCutoff is None: yCutoff = xCutoff yCutoff = np.clip(int(yCutoff), 0, h / 2) flt = np.zeros((w, h)) flt[0:xCutoff, 0:yCutoff] = 255 flt[0:xCutoff, h - yCutoff:h] = 255 flt[w - xCutoff:w, 0:yCutoff] = 255 flt[w - xCutoff:w, h - yCutoff:h] = 255 img = Image(flt) lowpassFilter = DFT(size=size, numpyarray=flt, image=img, type="Lowpass", xCutoffLow=xCutoff, yCutoffLow=yCutoff, frequency="lowpass") return lowpassFilter
def createNotchFilter(self, dia1, dia2=None, cen=None, size=(64, 64), type="lowpass"): """ **SUMMARY** Creates a disk shaped notch filter of given diameter at given center. **PARAMETERS** * *dia1* - int - diameter of the disk shaped notch - list - provide a list of three diameters to create a 3 channel filter * *dia2* - int - outer diameter of the disk shaped notch used for bandpass filter - list - provide a list of three diameters to create a 3 channel filter * *cen* - tuple (x, y) center of the disk shaped notch if not provided, it will be at the center of the filter * *size* - size of the filter (width, height) * *type*: - lowpass or highpass filter **RETURNS** DFT notch filter **EXAMPLE** >>> notch = DFT.createNotchFilter(dia1=200, cen=(200, 200), size=(512, 512), type="highpass") >>> notch = DFT.createNotchFilter(dia1=200, dia2=300, cen=(200, 200), size=(512, 512)) >>> img = Image('lenna') >>> notch.applyFilter(img).show() """ if isinstance(dia1, list): if len(dia1) != 3 and len(dia1) != 1: warnings.warn("diameter list must be of size 1 or 3") return None if isinstance(dia2, list): if len(dia2) != 3 and len(dia2) != 1: warnings.warn("diameter list must be of size 3 or 1") return None if len(dia2) == 1: dia2 = [dia2[0]]*len(dia1) else: dia2 = [dia2]*len(dia1) if isinstance(cen, list): if len(cen) != 3 and len(cen) != 1: warnings.warn("center list must be of size 3 or 1") return None if len(cen) == 1: cen = [cen[0]]*len(dia1) else: cen = [cen]*len(dia1) stackedfilter = DFT() for d1, d2, c in zip(dia1, dia2, cen): stackedfilter = stackedfilter._stackFilters(self.createNotchFilter(d1, d2, c, size, type)) image = Image(stackedfilter._numpy) retVal = DFT(numpyarray=stackedfilter._numpy, image=image, dia=dia1+dia2, channels = len(dia1), size=size, type=stackedfilter._type, frequency=stackedfilter._freqpass) return retVal w, h = size if cen is None: cen = (w/2, h/2) a, b = cen y, x = np.ogrid[-a:w-a, -b:h-b] r = dia1/2 mask = x*x + y*y <= r*r flt = np.ones((w, h)) flt[mask] = 255 if type == "highpass": flt = 255-flt if dia2 is not None: a, b = cen y, x = np.ogrid[-a:w-a, -b:h-b] r = dia2/2 mask = x*x + y*y <= r*r flt1 = np.ones((w, h)) flt1[mask] = 255 flt1 = 255 - flt1 flt = flt + flt1 np.clip(flt, 0, 255) type = "bandpass" img = Image(flt) notchfilter = DFT(size=size, numpyarray=flt, image=img, dia=dia1, type="Notch", frequency=type) return notchfilter
def createLowpassFilter(self, xCutoff, yCutoff=None, size=(64, 64)): """ **SUMMARY** Creates a lowpass filter of given size and order. **PARAMETERS** * *xCutoff* - int - horizontal cut off frequency - list - provide a list of three cut off frequencies to create a 3 channel filter * *yCutoff* - int - vertical cut off frequency - list - provide a list of three cut off frequencies to create a 3 channel filter * *size* - size of the filter (width, height) **RETURNS** DFT filter. **EXAMPLE** >>> flt = DFT.createLowpassFilter(xCutoff=75, size=(320, 280)) >>> flt = DFT.createLowpassFilter(xCutoff=[75], size=(320, 280)) >>> flt = DFT.createLowpassFilter(xCutoff=[75, 100, 120], size=(320, 280)) >>> flt = DFT.createLowpassFilter(xCutoff=75, yCutoff=35, size=(320, 280)) >>> flt = DFT.createLowpassFilter(xCutoff=[75], yCutoff=[35], size=(320, 280)) >>> flt = DFT.createLowpassFilter(xCutoff=[75, 100, 125], yCutoff=35, size=(320, 280)) >>> # yCutoff will be [35, 35, 35] >>> flt = DFT.createLowpassFilter(xCutoff=[75, 113, 124], yCutoff=[35, 45, 90], size=(320, 280)) >>> img = Image('lenna') >>> flt.applyFilter(img).show() """ if isinstance(xCutoff, list): if len(xCutoff) != 3 and len(xCutoff) != 1: warnings.warn("xCutoff list must be of size 3 or 1") return None if isinstance(yCutoff, list): if len(yCutoff) != 3 and len(yCutoff) != 1: warnings.warn("yCutoff list must be of size 3 or 1") return None if len(yCutoff) == 1: yCutoff = [yCutoff[0]]*len(xCutoff) else: yCutoff = [yCutoff]*len(xCutoff) stackedfilter = DFT() for xfreq, yfreq in zip(xCutoff, yCutoff): stackedfilter = stackedfilter._stackFilters(self.createLowpassFilter(xfreq, yfreq, size)) image = Image(stackedfilter._numpy) retVal = DFT(numpyarray=stackedfilter._numpy, image=image, xCutoffLow=xCutoff, yCutoffLow=yCutoff, channels=len(xCutoff), size=size, type=stackedfilter._type, order=self._order, frequency=stackedfilter._freqpass) return retVal w, h = size xCutoff = np.clip(int(xCutoff), 0, w/2) if yCutoff is None: yCutoff = xCutoff yCutoff = np.clip(int(yCutoff), 0, h/2) flt = np.zeros((w, h)) flt[0:xCutoff, 0:yCutoff] = 255 flt[0:xCutoff, h-yCutoff:h] = 255 flt[w-xCutoff:w, 0:yCutoff] = 255 flt[w-xCutoff:w, h-yCutoff:h] = 255 img = Image(flt) lowpassFilter = DFT(size=size, numpyarray=flt, image=img, type="Lowpass", xCutoffLow=xCutoff, yCutoffLow=yCutoff, frequency="lowpass") return lowpassFilter