第4章 Python 數字圖像處理(DIP) - 頻率域濾波10 - 使用低通頻率域濾波器平滑圖像 - 理想、高斯、巴特沃斯低通濾波器

目錄

    • 使用低通頻率域濾波器平滑圖像
      • 理想低通濾波器(ILPF)
      • 高斯低通濾波器(GLPF)
      • 巴特沃斯低通濾波器
      • 低通濾波的例子

使用低通頻率域濾波器平滑圖像

理想低通濾波器(ILPF)

在以原點為中心的一個圓內無衰減地通過所有頻率,而在這個圓外“截止”所有的頻率的二維低通濾波器。

H(u,v)={1,D(u,v)≤D00,D(u,v)>D0(4.111)H(u, v) = \begin{cases} 1, &D(u, v) \leq D_0 \\0, &D(u, v) > D_0\end{cases} \tag{4.111}H(u,v)={1,0,?D(u,v)D0?D(u,v)>D0??(4.111)

D(u,v)=[(u?P/2)2+(v?Q/2)2]1/2(4.12)D(u, v) = \big[(u - P/2)^2 + (v - Q/2)^2 \big]^{1/2} \tag{4.12}D(u,v)=[(u?P/2)2+(v?Q/2)2]1/2(4.12)

D0D_0D0?是一個正常數,控制圓的大小

def idea_low_pass_filter(source, center, radius=5):"""create idea low pass filter param: source: input, source imageparam: center: input, the center of the filter, where is the lowest value, (0, 0) is top left corner, source.shape[:2] is center of the source imageparam: radius: input, the radius of the lowest value, greater value, bigger blocker out range, if the radius is 0, then allvalue is 0return a [0, 1] value filter"""M, N = source.shape[1], source.shape[0]u = np.arange(M)v = np.arange(N)u, v = np.meshgrid(u, v)D = np.sqrt((u - center[1]//2)**2 + (v - center[0]//2)**2)D0 = radiuskernel = D.copy()kernel[D > D0] = 0kernel[D <= D0] = 1return kernel
def plot_3d(ax, x, y, z):ax.plot_surface(x, y, z, antialiased=True, shade=True)ax.view_init(20, 60), ax.grid(b=False), ax.set_xticks([]), ax.set_yticks([]), ax.set_zticks([])
# 理想低通濾波器 ILPF
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import cmcenter = img_ori.shape
ILPF = idea_low_pass_filter(img_ori, center, radius=50)# 用來繪制3D圖
M, N = img_ori.shape[1], img_ori.shape[0]
u = np.arange(M)
v = np.arange(N)
u, v = np.meshgrid(u, v)fig = plt.figure(figsize=(21, 7))
ax_1 = fig.add_subplot(1, 3, 1, projection='3d')
plot_3d(ax_1, u, v, ILPF)ax_2 = fig.add_subplot(1, 3, 2)
ax_2.imshow(ILPF,'gray'), ax_2.set_xticks([]), ax_2.set_yticks([])h = ILPF[img_ori.shape[0]//2:, img_ori.shape[1]//2]
ax_3 = fig.add_subplot(1, 3, 3)
ax_3.plot(h), ax_3.set_xticks([0, 50]), ax_3.set_yticks([0, 1]), ax_3.set_xlim([0, 320]), ax_3.set_ylim([0, 1.2])plt.tight_layout()
plt.show()

在這里插入圖片描述

總圖像能量PTP_TPT?是對填充零后圖像的功率譜的各個分量在點(u,v)(u, v)(u,v)處求和得到。
PT=∑u=0P?1∑v=0Q?1P(u,v)(4.113)P_T = \sum_{u=0}^{P-1} \sum_{v=0}^{Q-1}P(u, v) \tag{4.113}PT?=u=0P?1?v=0Q?1?P(u,v)(4.113)

半徑為D0D_0D0?的圓將包含aaa%的功率
a=100[∑u=0∑v=0P(u,v)/PT](4.114)a = 100\Big[ \sum_{u=0} \sum_{v=0}P(u, v) /P_T \Big] \tag{4.114}a=100[u=0?v=0?P(u,v)/PT?](4.114)

def mask_ring(img_ori, d=10):ILPF_1 = idea_low_pass_filter(img_ori, img_ori.shape, radius=d)ILPF_2 = idea_low_pass_filter(img_ori, img_ori.shape, radius=d-1)ILPF = ILPF_1 - ILPF_2return ILPF
# 測試模型
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH04/Fig0441(a)(characters_test_pattern).tif', -1)
M, N = img_ori.shape[:2]# 填充
fp = pad_image(img_ori, mode='reflect')radius = [10, 30, 60, 160, 460]
mask = np.zeros(fp.shape)
for i in range(len(radius)):mask += mask_ring(fp, d=radius[i])plt.figure(figsize=(16, 8))
plt.subplot(1, 2, 1), plt.imshow(img_ori, cmap='gray'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(mask, cmap='gray'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

在這里插入圖片描述

注:功率計算不太正確

#功率計算不太正確
# 填充
fp = pad_image(img_ori, mode='constant')
# 中心化
fp_cen = centralized_2d(fp)
# 正變換
fft = np.fft.fft2(fp_cen)
spectrum = spectrum_fft(fft)
# spectrum = np.log(1 + spectrum)
PT = spectrum.sum()ILPF = idea_low_pass_filter(fp, fp.shape, D0=10)fh = fft * ILPF
spectrum = spectrum_fft(fh)
# spectrum = np.log(1 + spectrum)
P = spectrum.sum()
print(f"Power is -> {100*(P / PT)}")
Power is -> 3.269204251436661
def ilpf_test(img_ori, mode='constant', radius=10):M, N = img_ori.shape[:2]# 填充fp = pad_image(img_ori, mode='reflect')# 中心化fp_cen = centralized_2d(fp)# 正變換fft = np.fft.fft2(fp_cen)# 濾波器H = idea_low_pass_filter(fp, center=fp.shape, radius=radius)# 濾波HF = fft * H# 反變換ifft = np.fft.ifft2(HF)# 去中心化gp = centralized_2d(ifft.real)# 還回來與原圖像的大小g = gp[:M, :N]dst = np.uint8(normalize(g) * 255)return dst
# 頻率域濾波過程
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH04/Fig0441(a)(characters_test_pattern).tif', -1)radius = [10, 30, 60, 160, 460]fig = plt.figure(figsize=(15, 10))
for i in range(len(radius)+1):ax = fig.add_subplot(2, 3, i+1)if i == 0:ax.imshow(img_ori, 'gray'), ax.set_title('Original'), ax.set_xticks([]), ax.set_yticks([])else:img = ilpf_test(img_ori, radius=radius[i-1])ax.imshow(img, 'gray'), ax.set_title("radius = " + str(radius[i-1])), ax.set_xticks([]), ax.set_yticks([])
plt.tight_layout()
plt.show()

在這里插入圖片描述

# 頻率域ILPF傳遞函數對應的空間核函數
img_temp = np.zeros([1000, 1000])
ILPF = idea_low_pass_filter(img_temp, img_temp.shape, radius=15)
ifft = np.fft.ifft2(ILPF)
ifft = np.fft.ifftshift(ifft)
space = ifft.real * 1200
space_s = abs(space)
# space_s = np.clip(space, 0, space.max())
space_s = normalize(space_s)hx = space[:, 500]
hx = centralized_2d(hx.reshape(1, -1)).flatten()fig = plt.figure(figsize=(15, 5))
ax_1 = fig.add_subplot(1, 3, 1)
ax_1.imshow(ILPF, 'gray'), ax_1.set_xticks([]), ax_1.set_yticks([])ax_2 = fig.add_subplot(1, 3, 2)
ax_2.imshow(space_s, 'gray'), ax_2.set_xticks([]), ax_2.set_yticks([])ax_3 = fig.add_subplot(1, 3, 3)
ax_3.plot(hx), ax_3.set_xticks([]), ax_3.set_yticks([])plt.tight_layout()
plt.show()

在這里插入圖片描述

高斯低通濾波器(GLPF)

H(u,v)=e?D2(u,v)/2D02(4.116)H(u,v) = e^{-D^2(u,v) / 2D_0^2} \tag{4.116}H(u,v)=e?D2(u,v)/2D02?(4.116)
D0D_0D0?是截止頻率。當D(u,v)=D0D(u, v) = D_0D(u,v)=D0?時,GLPF傳遞函數下降到其最大值1.0的0.607。

def gauss_low_pass_filter(source, center, radius=5):"""create gauss low pass filter param: source: input, source imageparam: center: input, the center of the filter, where is the lowest value, (0, 0) is top left corner, source.shape[:2] is center of the source imageparam: radius: input, the radius of the lowest value, greater value, bigger blocker out range, if the radius is 0, then allvalue is 0return a [0, 1] value filter"""    M, N = source.shape[1], source.shape[0]u = np.arange(M)v = np.arange(N)u, v = np.meshgrid(u, v)D = np.sqrt((u - center[1]//2)**2 + (v - center[0]//2)**2)D0 = radiuskernel = np.exp(- (D**2)/(2*D0**2))return kernel
def plot_3d(ax, x, y, z):ax.plot_surface(x, y, z, antialiased=True, shade=True)ax.view_init(20, 60), ax.grid(b=False), ax.set_xticks([]), ax.set_yticks([]), ax.set_zticks([])
# 高斯低通濾波器 GLPF
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import cmcenter = img_ori.shapeGLPF_10 = gauss_low_pass_filter(img_ori, center, radius=10)
h_10 = GLPF_10[img_ori.shape[0]//2:, img_ori.shape[1]//2]
GLPF_20 = gauss_low_pass_filter(img_ori, center, radius=20)
h_20 = GLPF_20[img_ori.shape[0]//2:, img_ori.shape[1]//2]
GLPF_40 = gauss_low_pass_filter(img_ori, center, radius=40)
h_40 = GLPF_40[img_ori.shape[0]//2:, img_ori.shape[1]//2]
GLPF_60 = gauss_low_pass_filter(img_ori, center, radius=60)
h_60 = GLPF_60[img_ori.shape[0]//2:, img_ori.shape[1]//2]# 用來繪制3D圖
M, N = img_ori.shape[1], img_ori.shape[0]
u = np.arange(M)
v = np.arange(N)
u, v = np.meshgrid(u, v)fig = plt.figure(figsize=(21, 7))
ax_1 = fig.add_subplot(1, 3, 1, projection='3d')
plot_3d(ax_1, u, v, GLPF_60)ax_2 = fig.add_subplot(1, 3, 2)
ax_2.imshow(GLPF_60,'gray'), ax_2.set_xticks([]), ax_2.set_yticks([])ax_3 = fig.add_subplot(1, 3, 3)
ax_3.plot(h_10, label='$D_0=10$'), ax_3.set_xticks([0, 50]), ax_3.set_yticks([0, 1]), ax_3.set_xlim([0, 320]), ax_3.set_ylim([0, 1.2])
ax_3.plot(h_20, label='$D_0=20$')
ax_3.plot(h_40, label='$D_0=40$')
ax_3.plot(h_60, label='$D_0=60$')
plt.legend(loc='best')
plt.tight_layout()
plt.show()

在這里插入圖片描述

def glpf_test(img_ori, mode='constant', radius=10):M, N = img_ori.shape[:2]# 填充fp = pad_image(img_ori, mode=mode)# 中心化fp_cen = centralized_2d(fp)# 正變換fft = np.fft.fft2(fp_cen)# 濾波器H = gauss_low_pass_filter(fp, center=fp.shape, radius=radius)# 濾波HF = fft * H# 反變換ifft = np.fft.ifft2(HF)# 去中心化gp = centralized_2d(ifft.real)# 還回來與原圖像的大小g = gp[:M, :N]dst = np.uint8(normalize(g) * 255)return dst
# 高斯低通濾波器在頻率域濾波的使用,這效果要比理想低通濾波器好很多,不會出現振鈴效應
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH04/Fig0441(a)(characters_test_pattern).tif', -1)radius = [10, 30, 60, 160, 460]fig = plt.figure(figsize=(15, 10))
for i in range(len(radius)+1):ax = fig.add_subplot(2, 3, i+1)if i == 0:ax.imshow(img_ori, 'gray'), ax.set_title('Original'), ax.set_xticks([]), ax.set_yticks([])else:img = glpf_test(img_ori, mode='reflect', radius=radius[i-1])ax.imshow(img, 'gray'), ax.set_title("radius = " + str(radius[i-1])), ax.set_xticks([]), ax.set_yticks([])
plt.tight_layout()
plt.show()

在這里插入圖片描述

# 頻率域GLPF傳遞函數對應的空間核函數
img_temp = np.zeros([1000, 1000])
GLPF = gauss_low_pass_filter(img_temp, img_temp.shape, radius=15)
ifft = np.fft.ifft2(GLPF)
ifft = np.fft.ifftshift(ifft)
space = ifft.real * 1200
space_s = abs(space)
space_s = normalize(space_s)hx = space[:, 500]
hx = centralized_2d(hx.reshape(1, -1)).flatten()fig = plt.figure(figsize=(15, 5))
ax_1 = fig.add_subplot(1, 3, 1)
ax_1.imshow(GLPF, 'gray'), ax_1.set_xticks([]), ax_1.set_yticks([])ax_2 = fig.add_subplot(1, 3, 2)
ax_2.imshow(space_s, 'gray'), ax_2.set_xticks([]), ax_2.set_yticks([])ax_3 = fig.add_subplot(1, 3, 3)
ax_3.plot(hx), ax_3.set_xticks([]), ax_3.set_yticks([])plt.tight_layout()
plt.show()

在這里插入圖片描述

# 不使用傳統方法
import cv2
import numpy as np
import matplotlib.pyplot as pltimg_ic = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH04/Fig0429(a)(blown_ic).tif', 0) #直接讀為灰度圖像plt.figure(figsize=(15, 12))
plt.subplot(221),plt.imshow(img_ic,'gray'),plt.title('origial'), plt.xticks([]), plt.yticks([])#--------------------------------
fft = np.fft.fft2(img_ic)
fft_shift = np.fft.fftshift(fft)
amp_img = np.abs(np.log(1 + np.abs(fft_shift)))
plt.subplot(222),plt.imshow(amp_img,'gray'),plt.title('IC FFT'), plt.xticks([]), plt.yticks([])#--------------------------------
glpf = gauss_low_pass_filter(img_ic, img_ic.shape, radius=20)
plt.subplot(223),plt.imshow(glpf,'gray'),plt.title('mask'), plt.xticks([]), plt.yticks([])#--------------------------------
f1shift = fft_shift * glpf
f2shift = np.fft.ifftshift(f1shift) #對新的進行逆變換
img_new = np.fft.ifft2(f2shift)#出來的是復數,無法顯示
img_new = np.abs(img_new)#調整大小范圍便于顯示
img_new = (img_new-np.amin(img_new))/(np.amax(img_new)-np.amin(img_new))
plt.subplot(224),plt.imshow(img_new,'gray'),plt.title('GLPF'), plt.xticks([]), plt.yticks([])plt.tight_layout()
plt.show()

在這里插入圖片描述

巴特沃斯低通濾波器

H(u,v)=11+[D(u,v)/D0]2n(4.117)H(u,v) = \frac{1} {1 + [D(u,v) / D_0]^{2n}} \tag{4.117}H(u,v)=1+[D(u,v)/D0?]2n1?(4.117)
D(u,v)=[(u?M/2)2+(v?N/2)2]1/2D(u,v) = [(u - M/2)^2 + (v-N/2)^2]^{1/2}D(u,v)=[(u?M/2)2+(v?N/2)2]1/2

  • 特點
    • 較高的nnn值來控制這個BLPF函數可逼近ILPF的特性
    • 較低的nnn值來控制這個BLPF函數可逼近GLPF的特性,同時提供從低頻到高頻的平滑過渡。
    • 可用BLPF以小得多的振鈴效應來逼近ILPF函數的清晰度
def butterworth_low_pass_filter(img, center, radius=5, n=1):"""create butterworth low pass filter param: source: input, source imageparam: center: input, the center of the filter, where is the lowest value, (0, 0) is top left corner, source.shape[:2] is center of the source imageparam: radius: input, the radius of the lowest value, greater value, bigger blocker out range, if the radius is 0, then allvalue is 0param: n: input, float, the order of the filter, if n is small, then the BLPF will be close to GLPF, and more smooth from lowfrequency to high freqency.if n is large, will close to ILPFreturn a [0, 1] value filter"""  epsilon = 1e-8M, N = img.shape[1], img.shape[0]u = np.arange(M)v = np.arange(N)u, v = np.meshgrid(u, v)D = np.sqrt((u - center[1]//2)**2 + (v - center[0]//2)**2)D0 = radiuskernel = (1 / (1 + (D / (D0 + epsilon))**(2*n)))return kernel
def plot_3d(ax, x, y, z):ax.plot_surface(x, y, z, antialiased=True, shade=True)ax.view_init(20, 60), ax.grid(b=False), ax.set_xticks([]), ax.set_yticks([]), ax.set_zticks([])
# 巴特沃斯低通濾波器 BLPF
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import cmcenter = img_ori.shapeBLPF_60_1 = butterworth_low_pass_filter(img_ori, center, radius=60, n=1)
h_1 = BLPF_60_1[img_ori.shape[0]//2:, img_ori.shape[1]//2]
BLPF_60_2 = butterworth_low_pass_filter(img_ori, center, radius=60, n=2)
h_2 = BLPF_60_2[img_ori.shape[0]//2:, img_ori.shape[1]//2]
BLPF_60_3 = butterworth_low_pass_filter(img_ori, center, radius=60, n=3)
h_3 = BLPF_60_3[img_ori.shape[0]//2:, img_ori.shape[1]//2]
BLPF_60_4 = butterworth_low_pass_filter(img_ori, center, radius=60, n=4)
h_4 = BLPF_60_4[img_ori.shape[0]//2:, img_ori.shape[1]//2]# 用來繪制3D圖
M, N = img_ori.shape[1], img_ori.shape[0]
u = np.arange(M)
v = np.arange(N)
u, v = np.meshgrid(u, v)fig = plt.figure(figsize=(21, 7))
ax_1 = fig.add_subplot(1, 3, 1, projection='3d')
plot_3d(ax_1, u, v, BLPF_60_1)ax_2 = fig.add_subplot(1, 3, 2)
ax_2.imshow(BLPF_60_1,'gray'), ax_2.set_xticks([]), ax_2.set_yticks([])ax_3 = fig.add_subplot(1, 3, 3)
ax_3.plot(h_1, label='$n=1$'), ax_3.set_xticks([0, 50]), ax_3.set_yticks([0, 1]), ax_3.set_xlim([0, 320]), ax_3.set_ylim([0, 1.2])
ax_3.plot(h_2, label='$n=2$')
ax_3.plot(h_3, label='$n=3$')
ax_3.plot(h_4, label='$n=4$')
plt.legend(loc='best')
plt.tight_layout()
plt.show()

在這里插入圖片描述

def blpf_test(img_ori, mode='constant', radius=10, n=1):M, N = img_ori.shape[:2]# 填充fp = pad_image(img_ori, mode=mode)# 中心化fp_cen = centralized_2d(fp)# 正變換fft = np.fft.fft2(fp_cen)# 濾波器H = butterworth_low_pass_filter(fp, center=fp.shape, radius=radius, n=n)# 濾波HF = fft * H# 反變換ifft = np.fft.ifft2(HF)# 去中心化gp = centralized_2d(ifft.real)# 還回來與原圖像的大小g = gp[:M, :N]dst = np.uint8(normalize(g) * 255)return dst
# 巴特沃斯低通濾波器在頻率域濾波的使用
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH04/Fig0441(a)(characters_test_pattern).tif', -1)radius = [10, 30, 60, 160, 460]fig = plt.figure(figsize=(15, 10))
for i in range(len(radius)+1):ax = fig.add_subplot(2, 3, i+1)if i == 0:ax.imshow(img_ori, 'gray'), ax.set_title('Original'), ax.set_xticks([]), ax.set_yticks([])else:img = blpf_test(img_ori, mode='reflect', radius=radius[i-1], n=2.25)ax.imshow(img, 'gray'), ax.set_title("radius = " + str(radius[i-1])), ax.set_xticks([]), ax.set_yticks([])
plt.tight_layout()
plt.show()

在這里插入圖片描述

空間域的一階巴特沃斯沒有振鈴效應。在2階和3階濾波器中,振鈴效應通常難以察覺,但更高階濾波器中的振鈴效應很明顯。

# 頻率域GLPF傳遞函數對應的空間核函數
img_temp = np.zeros([1000, 1000])
BLPF = butterworth_low_pass_filter(img_temp, img_temp.shape, radius=15, n=25)
ifft = np.fft.ifft2(BLPF)
ifft = np.fft.ifftshift(ifft)
space = ifft.real * 1200
space_s = abs(space)
space_s = normalize(space_s)hx = space[:, 500]
hx = centralized_2d(hx.reshape(1, -1)).flatten()fig = plt.figure(figsize=(15, 5))
ax_1 = fig.add_subplot(1, 3, 1)
ax_1.imshow(GLPF, 'gray'), ax_1.set_xticks([]), ax_1.set_yticks([])ax_2 = fig.add_subplot(1, 3, 2)
ax_2.imshow(space_s, 'gray'), ax_2.set_xticks([]), ax_2.set_yticks([])ax_3 = fig.add_subplot(1, 3, 3)
ax_3.plot(hx), ax_3.set_xticks([]), ax_3.set_yticks([])plt.tight_layout()
plt.show()

在這里插入圖片描述

def frequen2spatial(filter):ifft = np.fft.ifft2(filter)ifft = np.fft.ifftshift(ifft)spatial = ifft.real * 1200spatial_s = abs(spatial)spatial_s = normalize(spatial_s)return spatial, spatial_s
# 頻率域BLPF傳遞函數對應的空間核函數
img_temp = np.zeros([1000, 1000])
n = [1, 2, 5, 20]fig = plt.figure(figsize=(20, 10))for i in range(len(n)):# 這是顯示空間域的核ax = fig.add_subplot(2, 4, i+1)BLPF = butterworth_low_pass_filter(img_temp, img_temp.shape, radius=15, n=n[i])spatial, spatial_s = frequen2spatial(BLPF)ax.imshow(spatial_s, 'gray'), ax.set_xticks([]), ax.set_yticks([])# 這里顯示是對應的空間域核水平掃描線的灰度分布ax = fig.add_subplot(2, 4, i+5)hx = spatial[:, 500]hx = centralized_2d(hx.reshape(1, -1)).flatten()ax.plot(hx, label=f'n = {n[i]}'), ax.set_xticks([]), ax.set_yticks([])ax.legend(loc='best', fontsize=14)
plt.tight_layout()
plt.show()

在這里插入圖片描述

低通濾波的例子

出下圖,我們可以清晰看到不同的截止頻率的核對圖像的平滑效果。我們杺選擇合適的核,以平滑圖像,再加上其它圖像處理技術,以達到想要的效果。
如下文字處理的例子,我們可以利用D0=20D_0=20D0?=20,來平滑圖像,再經過閾值處理,可以得到文字的蒙板。

# 高斯低通濾波器在印刷和出版業的應用
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH04/Fig0419(a)(text_gaps_of_1_and_2_pixels).tif', -1)radius = [10, 30, 60, 90, 120]fig = plt.figure(figsize=(17, 10))
for i in range(len(radius)+1):ax = fig.add_subplot(2, 3, i+1)if i == 0:ax.imshow(img_ori, 'gray'), ax.set_title('Original'), ax.set_xticks([]), ax.set_yticks([])else:img = glpf_test(img_ori, mode='reflect', radius=radius[i-1])ax.imshow(img, 'gray'), ax.set_title("radius = " + str(radius[i-1])), ax.set_xticks([]), ax.set_yticks([])
plt.tight_layout()
plt.show()

在這里插入圖片描述

# 高斯低通濾波器在印刷和出版業的應用
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH04/Fig0419(a)(text_gaps_of_1_and_2_pixels).tif', -1)radius = [10, 30, 60, 90, 120]fig = plt.figure(figsize=(17, 10))
ax = fig.add_subplot(1, 3, 1)
ax.imshow(img_ori, 'gray'), ax.set_title('Original'), ax.set_xticks([]), ax.set_yticks([])
ax = fig.add_subplot(1, 3, 2)
img = glpf_test(img_ori, mode='reflect', radius=20)
ax.imshow(img, 'gray'), ax.set_title("radius = " + str(20)), ax.set_xticks([]), ax.set_yticks([])
ax = fig.add_subplot(1, 3, 3)
ret, img_thred = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)
ax.imshow(img_thred, 'gray'), ax.set_title("Thred"), ax.set_xticks([]), ax.set_yticks([])
plt.tight_layout()
plt.show()

在這里插入圖片描述

# 高斯低通濾波器在印刷和出版業的應用,平滑后的圖像看上去更柔和、更美觀
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH04/Fig0427(a)(woman).tif', -1)radius = [10, 50, 80, 130, 150]fig = plt.figure(figsize=(17, 10))
for i in range(len(radius)+1):ax = fig.add_subplot(2, 3, i+1)if i == 0:ax.imshow(img_ori, 'gray'), ax.set_title('Original'), ax.set_xticks([]), ax.set_yticks([])else:img = glpf_test(img_ori, mode='reflect', radius=radius[i-1])ax.imshow(img, 'gray'), ax.set_title("radius = " + str(radius[i-1])), ax.set_xticks([]), ax.set_yticks([])
plt.tight_layout()
plt.show()

在這里插入圖片描述

# 高斯低通濾波器在衛星圖像的應用,這里對圖像的濾波的目的是尺可能模糊更多的細節,而保留可識別的大特征。
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH04/Fig0451(a)(satellite_original).tif', -1)radius = [10, 20, 50, 80, 100]fig = plt.figure(figsize=(17, 10))
for i in range(len(radius)+1):ax = fig.add_subplot(2, 3, i+1)if i == 0:ax.imshow(img_ori, 'gray'), ax.set_title('Original'), ax.set_xticks([]), ax.set_yticks([])else:img = glpf_test(img_ori, mode='reflect', radius=radius[i-1])ax.imshow(img, 'gray'), ax.set_title("radius = " + str(radius[i-1])), ax.set_xticks([]), ax.set_yticks([])
plt.tight_layout()
plt.show()

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260696.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260696.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260696.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vs2008中combox用法總結

1、判斷是否為空 m_CheckPoint.GetCurSel()-1; 2、清空 m_CheckPoint.ResetContent(); 3、添加 m_CheckPoint.AddString(str); 4、獲取某一索引的值 m_CheckPoint.GetLBText(j,str1);//j為索引&#xff0c;str1為存儲變量 5、刪除某一索引的值 m_CheckPoint.DeleteString(j);//…

bluecam連接步驟說明_廠家詳解旋片式真空泵使用說明

旋片式真空泵是有區分單雙極高速直聯結構的真空泵&#xff0c;是用來對密封容器抽除氣體的基本設備之一。旋片式真空泵的泵與電機連軸&#xff0c;有著高轉速、外型小、結構緊湊、流動性工作方便的優點。本文所使用旋片式真空泵使用說明資料&#xff0c;是臺冠真空泵技術團隊工…

python函數中可變參數的傳遞方式是_Python函數可變參數定義及其參數傳遞方式實例詳解...

本文實例講述了Python函數可變參數定義及其參數傳遞方式。分享給大家供大家參考。具體分析如下&#xff1a; python中 函數不定參數的定義形式如下&#xff1a; 1、func(*args) 傳入的參數為以元組形式存在args中&#xff0c;如&#xff1a; def func(*args): print args >&…

加載中做法

一個網頁在加載時&#xff0c;可給靜態部分加個加載中&#xff0c;而動態部分也即是真正內容用jq來改&#xff0c;這樣就有那個效果了轉載于:https://www.cnblogs.com/yedeying/p/3618815.html

Junit4常用注解

Junit4注解 JUnit4的測試類不用再繼承TestCase類了。使用注解會方便很多。 Before&#xff1a;初始化方法After&#xff1a;釋放資源Test&#xff1a;測試方法&#xff0c;在這里可以測試期望異常和超時時間Ignore&#xff1a;忽略的測試方法BeforeClass&#xff1a;針對所有測…

第4章 Python 數字圖像處理(DIP) - 頻率域濾波11 - 使用高通濾波器銳化圖像

目錄使用高通濾波器銳化圖像由低通濾波器得到理想、高斯和巴特沃斯高通濾波器指紋增強頻域中的拉普拉斯鈍化掩蔽、高提升濾波和高頻強調濾波同態濾波使用高通濾波器銳化圖像 由低通濾波器得到理想、高斯和巴特沃斯高通濾波器 HHP(u,v)1?HLP(u,v)(4.118)H_{HP}(u, v) 1 - H_{…

值類型 引用類型 堆棧 堆 之 異想

看了很多值類型 和 引用類型的文章&#xff08;谷歌能搜索出來的&#xff09;看了越多疑問越大&#xff0c;而這些資料中沒有具體的說明。問題&#xff1a;1、堆棧 和 堆 分別存于計算機的哪個硬件&#xff08;CPU緩存&#xff0c;內存&#xff0c;硬盤&#xff09;&#xff1f…

漫步者lollipods如何調節音量_漫步者MF5擴音器體驗:老師值得入手

對于教師職業來說&#xff0c;保護好嗓子是很重要的。每天為學生操勞&#xff0c;頻繁的講課&#xff0c;很多老師都遇上了喉嚨沙啞的問題。怎么樣才能保護好老師的嗓子呢&#xff1f;“小蜜蜂”是很多老師們的選擇&#xff0c;這種擴音器可以掛在腰間&#xff0c;通過麥克風&a…

數據庫之間數據轉換最快方法

用txt導入的方式是最快的&#xff0c;一般是秒級。 以ACCESS數據庫到SQLite數據庫為例&#xff1a; 第一步&#xff1a;導出ACCESS數據庫到txt文件&#xff1a; 一、將表中數據導出到文本文件&#xff08;TXT&#xff09;&#xff1a; Select * INTO [TEXT;DATABASEE:\TEMP].TE…

pandas刪除某列有空值的行_Python-零基礎學習Pandas知識點整理(2)

DataFrame數據的清洗--預處理操作import pandas as pdimport numpy as np#DataFrame數據框行或列的刪除#df.drop(labelsNone,axis0,indexNone,columnsNone,levelNone,inplaceFalse,error"raise")#labels 表示需要刪除的行或列的標簽&#xff0c;多行或多列用列表傳入…

JavaScript中的閉包

什么是閉包&#xff1f; 當函數可以記住并訪問所在的詞法作用域時&#xff0c;就產生了閉包&#xff0c;即使函數是在當前詞法作用域之外執行的。下面用一些代碼來解釋這個定義&#xff1a; function foo() {var a 2;function bar() {console.log(a); // 2}bar(); }foo(); 這…

第4章 Python 數字圖像處理(DIP) - 頻率域濾波12 - 選擇性濾波 - 帶阻

目錄選擇性濾波帶阻濾波器和帶通濾波器陷波濾波器選擇性濾波 處理特定的頻帶的濾波器稱為頻帶濾波器 帶阻濾波器&#xff1a; 若某個頻帶中的頻率被濾除 帶通濾波器&#xff1a; 若某個頻帶中的頻率被通過 處理小頻率矩形區域的濾波器稱為陷波濾波器 陷波帶阻濾波器&#x…

command line

對chrome 的IPC 感興趣&#xff0c;想通過他的單元測試來窺探。 無意中看到有一個command_line 類&#xff0c;因為是第二次碰到 &#xff2f;&#xff33;&#xff27;中也有一個&#xff43;&#xff4f;&#xff4d;&#xff4d;&#xff41;&#xff4e;&#xff44;類正好…

[物理學與PDEs]第1章第4節 電磁能量和電磁動量, 能量、動量守恒與轉化定律 4.3 電磁能量 (動量) 密度, 電磁能量流 (動量流) 密度...

1. 電磁能量密度: $\cfrac{1}{2}\sex{\ve_0E^2\cfrac{1}{\mu_0}B^2}$. 2. 電磁能量流密度向量: ${\bf S}\cfrac{1}{\mu_0}{\bf E}\times {\bf B}$. 3. 電磁動量密度向量: $\cfrac{1}{c^2}{\bf S}$. 4. 電磁動量流密度張量: $\cfrac{1}{2}\sex{\ve_0E^2\cfrac{1}{\mu_0}B^2}{\bf…

python打包工具報錯_python打包生成exe報錯

如圖所示 如果出現的是這個問題可以可以考慮以下方法 首先卸載原先下載的 Pyinstaller pip uninstall pyinstaller 再執行以下代碼&#xff0c;去github上下載 pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip 注釋&#xff1a;再次打包&#xff…

創建DLL、Lib以及使用DLL、Lib

1.要在生成DLL文件的同時生成Lib文件&#xff0c;函數聲明時前面要加__declspec(dllexport)。 可在頭文件中如下定義&#xff1a; #ifndef __MYDLL_H #define __MYDLL_H#ifdef MYDLL_EXPORTS #define MYDLL __declspec(dllexport) #else #define MYDLL __declspec(dllimport) #…

去除lcd圖片的摩爾紋_寶媽時尚產后有妊娠紋怎么辦?教你這三招,輕松修復肚皮!...

產后肚子上長妊娠紋&#xff0c;相信是很多媽媽的痛點。首先我們來介紹一下什么是妊娠紋。由于妊娠期荷爾蒙的影響&#xff0c;加之腹部膨隆使皮膚的彈力纖維與膠原纖維損傷或斷裂&#xff0c;腹部皮膚變薄變細&#xff0c;出現一些寬窄不同、長短不一的粉紅色或紫紅色的波浪狀…

anaconda 換清華鏡像源 windows

方法1 Windows 下安裝好Anaconda 應該會有如下這些應用&#xff0c;我們打開如下圖anaconda Prompt(下面簡稱prompt)&#xff0c;(當然CMD也可以&#xff0c;只是我比較喜歡用prompt) 打開如下圖 使用下面命令&#xff0c;即可以添加清華鏡像 conda config --add channels …

php冒泡排序和快速排序筆記

<?php $arr array(12,1,5,88,35,0,18,100,50,21,28,7,9,9.5);//交換兩值 function swap(&$m, &$n){$temp $m;$m $n;$n $temp;/* 如數組中有小數時&#xff0c;以下方法會省略小數點后面的數$m $m ^ $n;$n $m ^ $n;$m $m ^ $n;*/ }//冒泡排序 function bubbl…

提高表格可讀性的一些技巧

表格的應用由于工作原因&#xff0c;經常接觸到表格。我們發現&#xff0c;表格不但廣泛的運用在各類數據收集和分析&#xff0c;同時通過表格這樣一種二維矩陣來整理和陳列信息時&#xff08;即便最后的展示方式并非一個典型的表格樣式&#xff09;&#xff0c;能夠很好的表達…