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
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)
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))
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()