讨论纪要

  • 设多尺度指数为k(k = 1, 2, 3……)
  • 遍历图像(每次都取3*3的九宫格为研究单位)
  • 统计每个单位内存在噪声的个数的分布情况

图片素材

原图:

img

噪声图(20%噪声):

img_noise

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# python3.8
# utf-8
# 统计噪声分布情况

import cv2 as cv
import numpy as np


def shrink(channel, k):
"""
:param channel: 像素通道
:param k: 多尺度指数
:return: 小矩阵
"""

if k == 1:
return channel

row, col = np.array(channel).shape
result = []
for i in range(k):
for j in range(k):
result0 = [[0] * (col // k) for ri in range(row // k)]
for m in range(row // k):
for n in range(col // k):
if 0 <= m * k + (i - 1) * k < row and 0 <= n * k + (j - 1) * k < col:
result0[m][n] = channel[m * k + (i - 1) * k][n * k + (j - 1) * k]
result.append(result0)
return result


def cmp0(channel1, channel2, cnt):
"""
:param channel1: 像素通道1
:param channel2: 像素通道2
:param cnt: 统计数组
:return: cnt
"""
row, col = np.array(channel1).shape

for i in range(1, row - 1):
for j in range(1, col - 1):
cnt0 = 0
for m in range(3):
for n in range(3):
if 0 <= i + m < row and 0 <= j + n < col:
if channel1[i + m][j + n] != channel2[i + m][j + n]:
cnt0 += 1
cnt[cnt0] += 1
return cnt


def cmp(origin, noise, k, cnt):
"""
:param origin: 原图的某一通道
:param noise: 噪声图像的某一通道
:param k: 多尺度指数
:param cnt: cnt
:return: new cnt
"""

shrinked_origin = shrink(origin, k)
shrinked_noise = shrink(noise, k)

for i in range(k * k):
if k == 1:
cnt = cmp0(shrinked_origin, shrinked_noise, cnt)
else:
cnt = cmp0(shrinked_origin[i], shrinked_noise[i], cnt)
return cnt


def main(origin, noise, k):
"""
:param origin: 原图地址
:param noise: 噪声图地址
:param k: 多尺度指数
:return:
"""

# 建立统计数组,统计0个到9个噪声点的次数
cnt = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

img_origin = cv.imread(origin, 1)
img_noise = cv.imread(noise, 1)

b_origin, g_origin, r_origin = cv.split(img_origin)
b_noise, g_noise, r_noise = cv.split(img_noise)

cnt = cmp(b_origin, b_noise, k, cnt)
cnt = cmp(g_origin, g_noise, k, cnt)
cnt = cmp(r_origin, r_noise, k, cnt)

return cnt


if __name__ == '__main__':
origin_addr = 'img.png'
noise_addr = 'img_noise.png'
ki = 20
for i in range(1, ki):
print(i, ': ', main(origin_addr, noise_addr, i))

结果

1 : [37913, 57693, 37883, 14758, 3597, 637, 63, 6, 0, 0]
2 : [37846, 56020, 37246, 13848, 3574, 566, 76, 8, 0, 0]
3 : [38391, 54542, 35782, 13314, 3150, 648, 27, 0, 0, 0]
4 : [41556, 52310, 33718, 11641, 3167, 168, 0, 0, 0, 0]
5 : [36854, 49566, 32374, 14177, 4828, 765, 111, 0, 0, 0]
6 : [43444, 47958, 30239, 11964, 2043, 432, 0, 0, 0, 0]
7 : [46230, 46478, 28256, 9866, 1029, 441, 0, 0, 0, 0]
8 : [50508, 42172, 24850, 10246, 1392, 624, 0, 0, 0, 0]
9 : [46914, 37518, 26088, 12972, 3813, 1242, 0, 0, 0, 0]
10 : [53463, 41171, 19412, 4646, 1068, 240, 0, 0, 0, 0]
11 : [52524, 38412, 16932, 6822, 2643, 279, 0, 0, 0, 0]
12 : [65424, 29631, 14661, 6492, 1026, 270, 0, 0, 0, 0]
13 : [75999, 22551, 8235, 4530, 2052, 708, 0, 0, 0, 0]
14 : [79663, 21724, 10942, 2589, 330, 0, 0, 0, 0, 0]
15 : [77481, 19605, 11124, 3819, 1686, 360, 0, 0, 0, 0]
16 : [87633, 17988, 3285, 1356, 330, 0, 0, 0, 0, 0]
17 : [92328, 6741, 3807, 1782, 249, 0, 0, 0, 0, 0]
18 : [81849, 5629, 6010, 2776, 693, 243, 0, 0, 0, 0]
19 : [88299, 6501, 1809, 861, 0, 0, 0, 0, 0, 0]

image-20211118145333570