3-1
(1) 感觉就是图像模糊了,并没有去噪
from cv2 import cv2
import numpy as np
import randomdef spNoise(img,prob):# 添加椒盐噪声,prob:噪声比例 output = np.zeros(img.shape,np.uint8)thres = 1 - prob for i in range(img.shape[0]):for j in range(img.shape[1]):rdn = random.random()if rdn < prob:output[i][j] = 0elif rdn > thres:output[i][j] = 255else:output[i][j] = img[i][j]return outputdef gaussNoise(img, mean=0, var=0.0001):# 添加,高斯噪声mean : 均值,var : 方差img = np.array(img/255, dtype=float)noise = np.random.normal(mean, var ** 0.5, img.shape)out = img + noiseif out.min() < 0:low_clip = -1.else:low_clip = 0.out = np.clip(out, low_clip, 1.0)out = np.uint8(out*255)return outdef meanFilter(img, c):# 均值滤波,2c+1*2c+1矩阵取平均值img_shape = np.shape(img)out = np.zeros(img_shape)for i in range(img_shape[0]):for j in range(img_shape[1]):if i >= c and i < img_shape[0] - c and j >= c and j < img_shape[1] - c:out[i][j] = min(sum(img[i - c:i + c + 1, j - c:j + c + 1].flatten()) // ((2 * c + 1) * (2 * c + 1)), img[i][j])else:out[i][j] = img[i][j]return outdef medianFilter(img, c):# 中值滤波,2c+1*2c+1矩阵再取中值img_shape = np.shape(img)out = np.zeros(img_shape)for i in range(img_shape[0]):for j in range(img_shape[1]):if i >= c and i < img_shape[0] - c and j >= c and j < img_shape[1] - c:out[i][j] = medianValueOdd(img[i - c:i + c + 1, j - c:j + c + 1].flatten())else:out[i][j] = img[i][j]return outdef medianValueOdd(arr):# 希尔排序length = len(arr)gap = length//2while gap > 0:for i in range(gap, length):tem = arr[i]j = i while j >= gap and arr[j-gap] >tem: arr[i], arr[i - gap] = arr[i - gap], arr[i]j -= gap gap = gap // 2return arr[length//2]img = cv2.imread("C:\\test\\1.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)img_noise = spNoise(gray, 0.0005)
img_noise = gaussNoise(img_noise)img_mean_filter1 = meanFilter(img_noise, 1)
img_mean_filter2 = meanFilter(img_noise, 2)
img_mean_filter3 = meanFilter(img_noise, 3)
img_median_filter1 = medianFilter(img_noise, 1)
img_median_filter2 = medianFilter(img_noise, 2)
img_median_filter3 = medianFilter(img_noise, 3)cv2.imwrite("C:\\test\\img_mean_filter1.jpg", img_mean_filter1)
cv2.imwrite("C:\\test\\img_mean_filter2.jpg", img_mean_filter2)
cv2.imwrite("C:\\test\\img_mean_filter3.jpg", img_mean_filter3)
cv2.imwrite("C:\\test\\img_median_filter1.jpg", img_median_filter1)
cv2.imwrite("C:\\test\\img_median_filter2.jpg", img_median_filter2)
cv2.imwrite("C:\\test\\img_median_filter3.jpg", img_median_filter3)img_mean_filter1 = cv2.imread("C:\\test\\img_mean_filter1.jpg")
img_mean_filter2 = cv2.imread("C:\\test\\img_mean_filter2.jpg")
img_mean_filter3 = cv2.imread("C:\\test\\img_mean_filter3.jpg")
img_median_filter1 = cv2.imread("C:\\test\\img_median_filter1.jpg")
img_median_filter2 = cv2.imread("C:\\test\\img_median_filter2.jpg")
img_median_filter3 = cv2.imread("C:\\test\\img_median_filter3.jpg")cv2.imshow('gray', gray)
cv2.imshow('img_noise', img_noise)
cv2.imshow('img_mean_filter1', img_mean_filter1)
cv2.imshow('img_mean_filter2', img_mean_filter2)
cv2.imshow('img_mean_filter3', img_mean_filter3)
cv2.imshow('img_median_filter1', img_median_filter1)
cv2.imshow('img_median_filter2', img_median_filter2)
cv2.imshow('img_median_filter3', img_median_filter3)
cv2.waitKey()
cv2.destroyAllWindows
4-1
(2)使用K邻近滤波和对称邻近滤波,发现K邻近滤波时,若仅取K=3,会产生很多早点,取K=5,K=7时,能有效去噪
from cv2 import cv2
import numpy as np
import randomdef spNoise(img,prob):# 添加椒盐噪声,prob:噪声比例 output = np.zeros(img.shape,np.uint8)thres = 1 - prob for i in range(img.shape[0]):for j in range(img.shape[1]):rdn = random.random()if rdn < prob:output[i][j] = 0elif rdn > thres:output[i][j] = 255else:output[i][j] = img[i][j]return outputdef gaussNoise(img, mean=0, var=0.0001):# 添加,高斯噪声mean : 均值,var : 方差img = np.array(img/255, dtype=float)noise = np.random.normal(mean, var ** 0.5, img.shape)out = img + noiseif out.min() < 0:low_clip = -1.else:low_clip = 0.out = np.clip(out, low_clip, 1.0)out = np.uint8(out*255)return outdef shellSort(arr):# 希尔排序length = len(arr)gap = length//2while gap > 0:for i in range(gap, length):tem = arr[i]j = i while j >= gap and arr[j-gap] >tem: arr[i], arr[i - gap] = arr[i - gap], arr[i]j -= gap gap = gap // 2return arrdef kNeighborFilter(img, N):square = N * NK = 2 * N - 1q = N // 2img_shape = np.shape(img)out = np.zeros(img_shape)for i in range(img_shape[0]):for j in range(img_shape[1]):if i >= q and i < img_shape[0] - q and j >= q and j < img_shape[1] - q:img_flatten = img[i - q:i + q + 1, j - q:j + q + 1].flatten()arr = np.append(img_flatten[0:square // 2], (img_flatten[square // 2 + 1:]))arr = shellSort(arr)p = 0while p < len(arr)-1:if arr[p] > img[i][j]:breakif arr[p] <= img[i][j] and arr[p + 1] >= img[i][j]:breakp += 1if p < K // 2:out[i][j] = sum(arr[0:K]) // Kelif p > square - K // 2:out[i][j] = sum(arr[square - K:]) // Kelse:out[i][j] = sum(arr[p - K // 2:p + K // 2 + 1]) // Kelse:out[i][j] = img[i][j]return outdef symmetricNeighborFilter(img, N):p = N // 2img_shape = np.shape(img)out = np.zeros(img_shape)for i in range(img_shape[0]):for j in range(img_shape[1]):if i >= p and i < img_shape[0] - p and j >= p and j < img_shape[1] - p:tem = []for k in range(i - p, i + p + 1):for l in range(j - p, j):tem.append([img[k][l], img[2 * i - k][2 * j - l]])for k in range(i - p, i):tem.append([img[k, j], img[2 * i - k][j]])total = 0print(tem)for m in range(len(tem)):if abs(tem[m][0] - img[i][j]) < abs(tem[m][1] - img[i][j]):total += tem[m][0]else:total += tem[m][1]print(total)out[i][j] = total // len(tem)print(out[i][j])else:out[i][j] = img[i][j]return outimg = cv2.imread("C:\\test\\1.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)img_noise = spNoise(gray, 0.0005)
img_noise = gaussNoise(img_noise)k_neighbor_filter1 = kNeighborFilter(img_noise, 3)
k_neighbor_filter2 = kNeighborFilter(img_noise, 5)
k_neighbor_filter3 = kNeighborFilter(img_noise, 7)
symmetric_neighbor_filter1 = symmetricNeighborFilter(img_noise, 3)
symmetric_neighbor_filter2 = symmetricNeighborFilter(img_noise, 5)
symmetric_neighbor_filter3 = symmetricNeighborFilter(img_noise, 7)cv2.imwrite("C:\\test\\kNeighborFilter3.jpg", k_neighbor_filter1)
cv2.imwrite("C:\\test\\kNeighborFilter5.jpg", k_neighbor_filter2)
cv2.imwrite("C:\\test\\kNeighborFilter7.jpg", k_neighbor_filter3)
cv2.imwrite("C:\\test\\symmetricNeighborFilter3.jpg", symmetric_neighbor_filter1)
cv2.imwrite("C:\\test\\symmetricNeighborFilter5.jpg", symmetric_neighbor_filter2)
cv2.imwrite("C:\\test\\symmetricNeighborFilter7.jpg", symmetric_neighbor_filter3)k_neighbor_filter1 = cv2.imread("C:\\test\\kNeighborFilter3.jpg")
k_neighbor_filter2 = cv2.imread("C:\\test\\kNeighborFilter5.jpg")
k_neighbor_filter3 = cv2.imread("C:\\test\\kNeighborFilter7.jpg")
symmetric_neighbor_filter1 = cv2.imread("C:\\test\\symmetricNeighborFilter3.jpg")
symmetric_neighbor_filter2 = cv2.imread("C:\\test\\symmetricNeighborFilter5.jpg")
symmetric_neighbor_filter3 = cv2.imread("C:\\test\\symmetricNeighborFilter7.jpg")cv2.imshow('gray', gray)
cv2.imshow('img_noise', img_noise)
cv2.imshow('kNeighborFilter3', k_neighbor_filter1)
cv2.imshow('kNeighborFilter5', k_neighbor_filter2)
cv2.imshow('kNeighborFilter7', k_neighbor_filter3)
cv2.imshow('kNeighborFilter3', symmetric_neighbor_filter1)
cv2.imshow('kNeighborFilter5', symmetric_neighbor_filter2)
cv2.imshow('kNeighborFilter7', symmetric_neighbor_filter3)
cv2.waitKey()
cv2.destroyAllWindows
4-1(3)看起来开运算去掉了白点,闭运算去掉了黑点
from cv2 import cv2
import numpy as np
import randomdef spNoise(img,prob):# 添加椒盐噪声,prob:噪声比例 output = np.zeros(img.shape,np.uint8)thres = 1 - prob for i in range(img.shape[0]):for j in range(img.shape[1]):rdn = random.random()if rdn < prob:output[i][j] = 0elif rdn > thres:output[i][j] = 255else:output[i][j] = img[i][j]return outputdef gaussNoise(img, mean=0, var=0.0001):# 添加,高斯噪声mean : 均值,var : 方差img = np.array(img/255, dtype=float)noise = np.random.normal(mean, var ** 0.5, img.shape)out = img + noiseif out.min() < 0:low_clip = -1.else:low_clip = 0.out = np.clip(out, low_clip, 1.0)out = np.uint8(out*255)return outdef grayErosion(img, N):arr = np.ones((N, N))p = N // 2img_shape = np.shape(img)out = np.zeros(img_shape)for i in range(img_shape[0]):for j in range(img_shape[1]):if i >= p and i < img_shape[0] - p and j >= p and j < img_shape[1] - p:out[i][j] = max(0, min(img[i - p:i + p + 1, j - p:j + p + 1].flatten()-arr.flatten()))else:out[i][j] = img[i][j]return outdef grayScale(img, N):arr = np.ones((N, N))p = N // 2img_shape = np.shape(img)out = np.zeros(img_shape)for i in range(img_shape[0]):for j in range(img_shape[1]):if i >= p and i < img_shape[0] - p and j >= p and j < img_shape[1] - p:out[i][j] = min(255, max(img[i - p:i + p + 1, j - p:j + p + 1].flatten()-arr.flatten()))else:out[i][j] = img[i][j] return outdef openFilter(img, arr):return grayScale(grayErosion(img, arr), arr)def closeFilter(img, arr):return grayErosion(grayScale(img, arr), arr)img = cv2.imread("C:\\test\\1.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)img_noise = spNoise(gray, 0.0005)
img_noise = gaussNoise(img_noise)image_open_filter = openFilter(img_noise, 3)
image_close_filter = closeFilter(img_noise, 3)cv2.imwrite("C:\\test\\image_open_filter.jpg", image_open_filter)
cv2.imwrite("C:\\test\\image_close_filter.jpg", image_close_filter)image_open_filter = cv2.imread("C:\\test\\image_open_filter.jpg")
image_close_filter = cv2.imread("C:\\test\\image_close_filter.jpg")cv2.imshow('gray', gray)
cv2.imshow('img_noise', img_noise)
cv2.imshow('image_open_filter', image_open_filter)
cv2.imshow('image_close_filter', image_close_filter)
cv2.waitKey()
cv2.destroyAllWindows