Ejemplo n.º 1
0
def hyper_run_bm3d_tf(im_dir, im_name, sigma, nH, kH, NH, pH, tauMatchH,
                      useSDH, tau_2DH, lambda3DH, nW, kW, NW, pW, tauMatchW,
                      useSDW, lamb):
    nW = 2 * kW
    im = cv2.imread('test_data/image/' + im_name, cv2.IMREAD_GRAYSCALE)
    im_noisy = cv2.imread(
        'noisy_image_and_1st_res/' + im_name[:-4] + '_sigma' + str(sigma) +
        '.png', cv2.IMREAD_GRAYSCALE)
    im_basic = cv2.imread(
        'noisy_image_and_1st_res/' + im_name[:-4] + '_sigma' + str(sigma) +
        '_1st.png', cv2.IMREAD_GRAYSCALE)

    im_noisy_p = symetrize(im_noisy, nW)
    im_basic_p = symetrize(im_basic, nW)
    im_denoised = bm3d_2nd_step_trendfilter3D(im_noisy_p, im_basic_p, nW, kW,
                                              NW, pW, tauMatchW, useSDW, lamb)
    im_denoised = im_denoised[nW:-nW, nW:-nW]

    im_basic = (np.clip(im_basic, 0, 255)).astype(np.uint8)
    im_denoised = (np.clip(im_denoised, 0, 255)).astype(np.uint8)

    psnr = compute_psnr(im, im_denoised)
    return im_basic, im_denoised, psnr
Ejemplo n.º 2
0
            tauMatch_W = 400 if sigma < 35 else 3500  # ! threshold determinates similarity between patches
            noisy_dir = '../test_data/sigma' + str(sigma)

            im_path = os.path.join(input_dir, im_name)
            im = cv2.imread(im_path, cv2.IMREAD_GRAYSCALE)
            noisy_im_path = os.path.join(noisy_dir, im_name)
            noisy_im = cv2.imread(noisy_im_path, cv2.IMREAD_GRAYSCALE)
            # for lamb in [1, 2, 3, 4, 10, 20, 30, 40, 50, 60, 70, 80, 100]:
            # for lamb in [7.2, 7.5, 7.7, 8, 8.2, 8.5, 8.7]:
            # for lamb in [4, 5, 6, 7, 8, 8.3, 8.4, 9, 10, 12, 20]:
            for lamb in [8.1, 8.2]:
                im1, im2 = run_bm3d(noisy_im, sigma,
                                    n_H, k_H, N_H, p_H, tauMatch_H, useSD_H, tau_2D_H, lambda3D_H,
                                    n_W, k_W, N_W, p_W, tauMatch_W, useSD_W, tau_2D_W, (8.2, 8.2, lamb))

                psnr_1st = compute_psnr(im, im1)
                psnr_2nd = compute_psnr(im, im2)

                im1 = (np.clip(im1, 0, 255)).astype(np.uint8)
                im2 = (np.clip(im2, 0, 255)).astype(np.uint8)

                save_name = im_name[:-4] + '+sigma_' + str(
                    sigma) + '-1st_' + tau_2D_H + '-lambda_' + str(lamb) + '=PSNR_' + '%.4f' % psnr_1st + '.png'
                cv2.imwrite(os.path.join(save_dir, save_name), im1)
                print(save_name)
                save_name = im_name[:-4] + '+sigma_' + str(
                    sigma) + '-1st_' + tau_2D_H + '-2nd_' + tau_2D_W + '-lambda_' + str(
                    lamb) + '=PSNR_' + '%.4f' % psnr_2nd + '.png'
                cv2.imwrite(os.path.join(save_dir, save_name), im2)
                print(save_name)
Ejemplo n.º 3
0
if __name__ == '__main__':
    from psnr import compute_psnr
    from utils import add_gaussian_noise, symetrize

    # <hyper parameter> -------------------------------------------------------------------------------
    sigma = 20

    nWien = 16
    kWien = 8
    NWien = 16
    pWien = 3
    tauMatchWien = 400 if sigma < 35 else 3500  # ! threshold determinates similarity between patches
    useSD_w = True
    tau_2D_wien = 'DCT'
    # <\ hyper parameter> -----------------------------------------------------------------------------

    img = cv2.imread('Cameraman256.png', cv2.IMREAD_GRAYSCALE)
    img_noisy = cv2.imread('image_noise.png', cv2.IMREAD_GRAYSCALE)
    img_basic = cv2.imread('y_basic.png', cv2.IMREAD_GRAYSCALE)

    img_basic_p = symetrize(img_basic, nWien)
    img_noisy_p = symetrize(img_noisy, nWien)
    img_denoised = bm3d_2nd_step(sigma, img_noisy_p, img_basic_p, nWien, kWien,
                                 NWien, pWien, tauMatchWien, useSD_w,
                                 tau_2D_wien)
    img_denoised = img_denoised[nWien:-nWien, nWien:-nWien]

    psnr_2st = compute_psnr(img, img_denoised)
    print('img and img_denoised PSNR: ', psnr_2st)
    # cv2.imwrite('y_final.png', img_denoised.astype(np.uint8))
Ejemplo n.º 4
0
def compare_psnr(im_name):
    sigma_list = [2, 5, 10, 20, 30, 40, 60, 80, 100]

    im_dir = '../test_data/image'
    py_res_dir = 'python'
    cpp_res_dir = 'cpp'

    im = cv2.imread(os.path.join(im_dir, im_name))

    f_p_c_1 = list()
    u_p_c_1 = list()
    f_p_c_2 = list()
    u_p_c_2 = list()

    f_p_p_1 = list()
    u_p_p_1 = list()
    f_p_p_2 = list()
    u_p_p_2 = list()

    for sigma in sigma_list:
        for cpp_res_im_name in os.listdir(cpp_res_dir):
            if im_name[:-4] + '_s' + str(sigma) + '_' in cpp_res_im_name:
                if 'cpp_1st' in cpp_res_im_name:
                    P_str = cpp_res_im_name.split('_')[-1][1:-4]
                    float_psnr_cpp_1st = float(P_str)
                    f_p_c_1.append(float_psnr_cpp_1st)

                    im_res = cv2.imread(
                        os.path.join(cpp_res_dir, cpp_res_im_name))
                    uint8_psnr_cpp_1st = compute_psnr(im, im_res)
                    u_p_c_1.append(uint8_psnr_cpp_1st)
                elif 'cpp_2nd' in cpp_res_im_name:
                    P_str = cpp_res_im_name.split('_')[-1][1:-4]
                    float_psnr_cpp_2nd = float(P_str)
                    f_p_c_2.append(float_psnr_cpp_2nd)

                    im_res = cv2.imread(
                        os.path.join(cpp_res_dir, cpp_res_im_name))
                    uint8_psnr_cpp_2nd = compute_psnr(im, im_res)
                    u_p_c_2.append(uint8_psnr_cpp_2nd)
        for py_res_im_name in os.listdir(py_res_dir):
            if im_name[:-4] + '_s' + str(sigma) + '_' in py_res_im_name:
                if 'py_1st' in py_res_im_name:
                    P_str = py_res_im_name.split('_')[-1][1:-4]
                    float_psnr_py_1st = float(P_str)
                    f_p_p_1.append(float_psnr_py_1st)

                    im_res = cv2.imread(
                        os.path.join(py_res_dir, py_res_im_name))
                    uint8_psnr_py_1st = compute_psnr(im, im_res)
                    u_p_p_1.append(uint8_psnr_py_1st)
                elif 'py_2nd' in py_res_im_name:
                    P_str = py_res_im_name.split('_')[-1][1:-4]
                    float_psnr_py_2nd = float(P_str)
                    f_p_p_2.append(float_psnr_py_2nd)

                    im_res = cv2.imread(
                        os.path.join(py_res_dir, py_res_im_name))
                    uint8_psnr_py_2nd = compute_psnr(im, im_res)
                    u_p_p_2.append(uint8_psnr_py_2nd)

    l1 = plt.plot(sigma_list, u_p_c_2, 'g--', label='cpp_version')
    l2 = plt.plot(sigma_list, u_p_p_2, 'b--', label='py_version')

    for x, cpp, py in zip(sigma_list, u_p_c_2, u_p_p_2):
        plt.text(x,
                 cpp,
                 'cpp' + '%.3f' % cpp,
                 ha='center',
                 va='top',
                 fontsize=10,
                 color='g')
        plt.text(x,
                 py,
                 'py' + '%.3f' % py,
                 ha='center',
                 va='bottom',
                 fontsize=10,
                 color='b')
    plt.rcParams['savefig.dpi'] = 300  # 图片像素
    plt.rcParams['figure.dpi'] = 300  # 分辨率
    plt.title(im_name)
    plt.xlabel('sigma')
    plt.ylabel('psnr')
    plt.legend()
    plt.savefig(im_name)
    plt.show()