共计 2197 个字符,预计需要花费 6 分钟才能阅读完成。
提醒:本文最后更新于 2024-08-28 11:13,文中所关联的信息可能已发生改变,请知悉!
概述
利用上周所得到的枚举的划分标准,编写降噪程序
代码示例
部分枚举的情况因为时间原因暂时未处理,用最接近的值代替
# python3.8
# utf-8
# followed by 20211020 report
import cv2 as cv
class NineGrid:
def __init__(self, a, d, flag):
self.a = a
self.d = d
self.flag = flag
def best_pixel(nine, k):
min_d = 255
min_x = 0
min_y = 0
for i in range(3):
for j in range(3):
if nine.flag[i][j] == k and nine.d[i][j] < min_d:
min_x = i
min_y = j
min_d = nine.d[i][j]
return nine.a[min_x][min_y]
def _1d_2_2d(x):
if x == 0:
return 0, 0
elif x == 1:
return 0, 1
elif x == 2:
return 0, 2
elif x == 3:
return 1, 2
elif x == 4:
return 2, 2
elif x == 5:
return 2, 1
elif x == 6:
return 2, 0
elif x == 7:
return 1, 0
def find_best(channel, x, y):
a = [[0]*3 for i in range(3)]
for i in range(3):
for j in range(3):
a[i][j] = channel[x - 1 + i][y - 1 + j]
d = [[0]*3 for i in range(3)]
for i in range(3):
for j in range(3):
d[i][j] = abs(int(a[i][j]) - int(a[1][1]))
dp = [0] * 8
for i in range(8):
dx, dy = _1d_2_2d(i)
dp[i] = d[dx][dy]
dps = sorted(dp)
max_index = dps.index(max(dps))
flag = [[0]*3 for i in range(3)]
for i in range(3):
for j in range(3):
if d[i][j] >= dps[max_index]:
flag[i][j] = 1
# 中心点暂时不分区
flag[1][1] = 2
# 枚举匹配 flag 特征
# A:B = 1:7
cnt = 0
for i in range(3):
for j in range(3):
if flag[i][j] == 0:
cnt += 1
min_d = 255
min_x = 0
min_y = 0
if cnt == 0:
for i in range(3):
for j in range(3):
if d[i][j] < min_d:
min_d = d[i][j]
min_x = i
min_y = j
elif cnt == 1:
for i in range(3):
for j in range(3):
if flag[i][j] == 1 and d[i][j] < min_d:
min_d = d[i][j]
min_x = i
min_y = j
elif cnt == 7:
for i in range(3):
for j in range(3):
if flag[i][j] == 0 and d[i][j] < min_d:
min_d = d[i][j]
min_x = i
min_y = j
elif cnt == 2:
for i in range(3):
for j in range(3):
if flag[i][j] == 1 and d[i][j] < min_d:
min_d = d[i][j]
min_x = i
min_y = j
elif cnt == 6:
for i in range(3):
for j in range(3):
if flag[i][j] == 0 and d[i][j] < min_d:
min_d = d[i][j]
min_x = i
min_y = j
elif cnt == 3:
for i in range(3):
for j in range(3):
if flag[i][j] == 1 and d[i][j] < min_d:
min_d = d[i][j]
min_x = i
min_y = j
elif cnt == 5:
for i in range(3):
for j in range(3):
if flag[i][j] == 0 and d[i][j] < min_d:
min_d = d[i][j]
min_x = i
min_y = j
elif cnt == 4:
for i in range(3):
for j in range(3):
if d[i][j] < min_d:
min_d = d[i][j]
min_x = i
min_y = j
return a[min_x][min_y]
def denoise(channel):
row, col = channel.shape
for i in range(1, row - 1):
for j in range(1, col - 1):
channel[i][j] = find_best(channel, i, j)
return channel
def main(addr):
img = cv.imread(addr, 1)
b, g, r = cv.split(img)
b = denoise(b)
g = denoise(g)
r = denoise(r)
img = cv.merge((b, g, r))
cv.imwrite('denoise_' + addr, img)
if __name__ == '__main__':
img_addr = 'noise_img.png'
main(img_addr)
效果
在原来已降噪过的图像的基础上,还略有效果
正文完