图像处理20211117

72次阅读
没有评论

共计 2494 个字符,预计需要花费 7 分钟才能阅读完成。

提醒:本文最后更新于 2024-08-29 10:16,文中所关联的信息可能已发生改变,请知悉!

讨论纪要

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

图片素材

原图:

图像处理 20211117

噪声图(20% 噪声):

图像处理 20211117

测试代码

# 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]

图像处理 20211117

正文完
 0
icvuln
版权声明:本站原创文章,由 icvuln 于2021-11-17发表,共计2494字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)