空间域:均值滤波与阈值处理
代码实现:
import cv2
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import rcParams
rcParams['font.family'] = 'simhei'
path = r"图片位置"
#读取图片,以灰度级的形式
img = cv2.imread(path,cv2.IMREAD_GRAYSCALE)
print(img)
from matplotlib import pyplot as plt
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([])
plt.show()
#生成均值滤波器
n = int(input("请输入均值滤波:"))
b_one = np.ones((n,n))
print(b_one)
#给图像矩阵增加行列,扩充
b_zero = np.zeros((n-1+img.shape[0],n-1+img.shape[1]))
print(b_zero)
print(img.shape)
print(b_zero.shape)
for i in range(int((n-1)/2),int((n-1)/2)+img.shape[0]):
for j in range(int((n-1)/2),int((n-1)/2)+img.shape[1]):
b_zero[i][j] = img[i-int((n-1)/2)][j-int((n-1)/2)]
print(b_zero)
b_zero1 = b_zero
plt.imshow(b_zero, cmap = 'gray', interpolation = 'bicubic')
plt.title("扩充后")
plt.xticks([]), plt.yticks([])
plt.show()
def lvbo(img,i,j,b_one):
b_row ,b_col = b_one.shape[0],b_one.shape[1]
sun = 0
z = 0 #滤波器行索引
for li in range(i-int((b_row-1)/2),i+int((b_row-1)/2)+1):
k = 0 #滤波器列索引
for lj in range(j-int((b_col-1)/2),j+int((b_col-1)/2)+1):
sun = sun + img[li][lj]*b_one[z][k]
k = k + 1
z = z + 1
return sun/(b_row*b_col)
#对每一个元素进行滤波,调用滤波函数
for i in range(int((n-1)/2),int((n-1)/2)+img.shape[0]):
for j in range(int((n-1)/2),int((n-1)/2)+img.shape[1]):
b_zero[i][j] = lvbo(b_zero1,i,j,b_one)
plt.imshow(b_zero, cmap = 'gray', interpolation = 'bicubic')
plt.title("滤波后")
plt.xticks([]), plt.yticks([])
plt.show()
#阈值处理
b_max = max(max(row) for row in b_zero)
print("最大值为:%d"%(b_max))
#阈值t
b_t = 0.25*b_max
print("阈值为:%d"%(b_t))
img = b_zero[int((n-1)/2):int((n-1)/2)+img.shape[0],int((n-1)/2):int((n-1)/2)+img.shape[1]]
for i in range(img.shape[0]):
for j in range(img.shape[1]):
if img[i][j]<b_t:
img[i][j] = 0
else:
img[i][j] = 255
print(img.shape)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.title("阈值处理后")
plt.xticks([]), plt.yticks([])
plt.show()
原始图片:
扩充后的图片,会发现比原始图片多了一圈黑色:
滤波后:
阈值处理后: