基于opencv的python中3*3邻域平滑,中值去模糊处理
调用numpy的zeros函数创建所需类型的3个数组,用于平滑,取中值和扩充之后的图片。然后用冒泡排序取得中间值完成中值处理,最后在一个窗口上显示。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('Fig0335.tif') # 测试图片
H = img.shape[0] #获取图片的高(像素点个数)
W = img.shape[1] #获取图片的宽(像素点个数)
img3 = np.zeros((H, W, 3), np.uint8) # 3*3邻域平滑后的图像
imgmid = np.zeros((H, W, 3), np.uint8) # 3*3邻域内取中值的图像
tmpImg = np.zeros((H + 2, W + 2, 3), np.uint8) # 扩充之后的图像
for i in range(H):
for j in range(W):
tmpImg[i + 1, j + 1] = img[i, j] #将测试图片复制到扩充之后的图像中
for i in range(H):
for j in range(W):
S = []
for x in range(3):
for y in range(3): #3*3邻域
# S[x * 3 + y] = tmpImg[i + x, j + y, 0]
S.append(tmpImg[i + x, j + y, 0])
img3[i, j, 0] = sum(S) // 9 #取平均值
img3[i, j, 1] = img3[i, j, 0]
img3[i, j, 2] = img3[i, j, 0]
# 冒泡排序,只要排到中间一个值,即4,因此x范围是8->3
for x in range(8, 3, -1): #从8减少到3,每次减少1,因为每循环一次就排好一个数
for y in range(x):
if S[y + 1] > S[y]: #小的数往后移
temp = S[y]
S[y] = S[y + 1]
S[y + 1] = temp
imgmid[i, j, 0] = S[4] #取中间值
imgmid[i, j, 1] = imgmid[i, j, 0]
imgmid[i, j, 2] = imgmid[i, j, 0]
# 原图
plt.subplot(1, 3, 1) #将窗口分为1行三列,第1个子图
plt.axis('off') #不显示坐标尺寸
plt.title('Original image') #第一幅图片标题
plt.imshow(img) #绘制第一幅图片
# 3*3邻域
plt.subplot(1, 3, 2)
plt.axis('off')
plt.title('3*3 smoothing')
plt.imshow(img3)
# 邻域中值替换之后
plt.subplot(1, 3, 3)
plt.axis('off')
plt.title('Middle Value Replaced Image')
plt.imshow(imgmid)
plt.show()
一个运行截图(基于一本数字图像处理书:冈萨雷斯)