图像处理20211103

84次阅读
没有评论

共计 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)

效果

图像处理 20211103

图像处理 20211103

在原来已降噪过的图像的基础上,还略有效果

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