混合STR图谱识别全流程:GBDT分类、比例估计与去噪复现
2026/11/4 3:11:30
【修订版】本文已整理到我的个人博客,订正了原文的几处错误:采样间隔写反了,线性插值核应为 1−|t|,三次卷积核与 B 样条核的系数也有误。CSDN 这一版保留原样,之后的勘误与更新只在博客进行:Image Resize : 数字图像的整数倍扩大 | Finn's blog
close all; clear all; clc; f = imread('./cheer/maru_256(cheer).tif'); f_Goal = imread('./cheer/maru_512(cheer).tif'); f = mat2gray(f,[0 255]); f_Goal = mat2gray(f_Goal,[0 255]); U = 2; %拡大率 [M,N] = size(f); g_hold = zeros((M*U),(N*U)); H_hold = ones(1,U); for x = 0:1:M-1 for y = 0:1:N-1 g_hold((U*x)+1,(U*y)+1) = f(x+1,y+1); end end for x = 1:1:U*M g_hold(x,:) = filter(H_hold,1,g_hold(x,:)); end for y = 1:1:U*N g_hold(:,y) = filter(H_hold,1,g_hold(:,y)); end g_hold_diff = zeros((M*U),(N*U)); for x = 1:1:(M*U) for y = 1:1:(N*U) g_hold_diff(x,y) = abs(f_Goal(x,y) - g_hold(x,y)); end end SAD_hold = sum(sum(g_hold_diff)) %SSD_hold = sum(sum(g_hold_diff .^2)) %MSE_hold = sum(sum(g_hold_diff .^2))/((M*U)*(M*U)); %PSNR_hold = 10*log10((1*1)/MSE_hold) figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel('a).Original Image (256x256)'); figure(); subplot(1,2,1); imshow(g_hold,[0 1]); xlabel('a).Ruselt of hold (512x512)'); subplot(1,2,2); imshow(g_hold_diff,[0 1]); xlabel('b).Difference image (512x512)'); figure(); w = 0:0.01:pi; Xejw_1 = freqz(H_hold,1,w); plot(w,abs(Xejw_1)); axis([0,pi,0,2]);grid; xlabel('\omega [rad]'); ylabel('|H(e^{j\omega_1})|'); f = imread('./cheer/maru_256(cheer).tif'); f_Goal = imread('./cheer/maru_512(cheer).tif'); f = mat2gray(f,[0 255]); f_Goal = mat2gray(f_Goal,[0 255]); U = 2; %拡大率 [M,N] = size(f); g_bilin = zeros((M*U)+6,(N*U)+6); H_bilin = [1 2 1]/2; for x = 1:1:M for y = 1:1:N g_bilin((U*x)+1,(U*y)+1) = f(x,y); end end g_bilin(1,:) = g_bilin(U+1,:); g_bilin((M*U)+U+1,:) = g_bilin((M*U)+1,:); g_bilin(:,1) = g_bilin(:,U+1); g_bilin(:,(M*U)+U+1) = g_bilin(:,(M*U)+1); for x = 1:1:(U*M)+6 g_bilin(x,:) = filter(H_bilin,1,g_bilin(x,:)); end for y = 1:1:(U*N)+6 g_bilin(:,y) = filter(H_bilin,1,g_bilin(:,y)); end g_b = zeros((M*U),(N*U)); for x = 1:1:(M*U) for y = 1:1:(M*U) g_b(x,y) = g_bilin(x+3,y+3); end end g_b_diff = zeros((M*U),(N*U)); for x = 1:1:(M*U) for y = 1:1:(N*U) g_b_diff(x,y) = abs(f_Goal(x,y) - g_b(x,y)); end end SAD_b = sum(sum(g_b_diff)) %SSD_b = sum(sum(g_b_diff .^2)) %MSE_b = sum(sum(g_b_diff .^2))/((M*U)*(M*U)); %PSNR_b = 10*log10((1*1)/MSE_b) figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel('a).Original Image (256x256)'); figure(); subplot(1,2,1); imshow(g_b,[0 1]); xlabel('a).Ruselt of bilinear interpolation (512x512)'); subplot(1,2,2); imshow(g_b_diff,[0 1]); xlabel('b).Difference image (512x512)'); figure(); w = 0:0.01:pi; Xejw_2 = freqz(H_bilin,1,w); plot(w,abs(Xejw_2)); axis([0,pi,0,2]);grid; xlabel('\omega [rad]'); ylabel('|H(e^{j\omega_1}|'); f = imread('./cheer/maru_256(cheer).tif'); f_Goal = imread('./cheer/maru_512(cheer).tif'); f = mat2gray(f,[0 255]); f_Goal = mat2gray(f_Goal,[0 255]); U = 2; %拡大率 [M,N] = size(f); g_cubic = zeros((M*U)+16,(N*U)+16); a = -0.0001; t = -1+(1/U):(1/U):1-(1/U); H_cubic = (a+2)*(abs(t).^(3))-(a+3)*(abs(t).^(2)) + 1; t = -2+(1/U):(1/U):-1; H_cubic = [0 (a)*(abs(t).^(3))-(a*5)*(abs(t).^(2))+(a*8)*abs(t)-4*a H_cubic]; t = 1:(1/U):2-(1/U); H_cubic = [H_cubic (a)*(abs(t).^(3))-(a*5)*(abs(t).^(2))+(a*8)*abs(t)-4*a 0]; for x = 1:1:M for y = 1:1:N g_cubic((U*x)+1,(U*y)+1) = f(x,y); end end g_cubic(1,:) = g_cubic(U+1,:); g_cubic((M*U)+U+1,:) = g_cubic((M*U)+1,:); g_cubic(:,1) = g_cubic(:,U+1); g_cubic(:,(M*U)+U+1) = g_cubic(:,(M*U)+1); for x = 1:1:(U*M+16) g_cubic(x,:) = filter(H_cubic,1,g_cubic(x,:)); end for y = 1:1:(U*N+16) g_cubic(:,y) = filter(H_cubic,1,g_cubic(:,y)); end g_c = zeros((M*U),(N*U)); for x = 1:1:(M*U) for y = 1:1:(M*U) g_c(x,y) = g_cubic(x+6,y+6); end end g_c_diff = zeros((M*U),(N*U)); for x = 1:1:(M*U) for y = 1:1:(N*U) g_c_diff(x,y) = abs(f_Goal(x,y) - g_c(x,y)); end end SAD_c = sum(sum(g_c_diff)) %SSD_c = sum(sum(g_c_diff .^2)) %MSE_c = sum(sum(g_c_diff .^2))/((M*U)*(M*U)); %PSNR_c = 10*log10((1*1)/MSE_c) figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel('a).Original Image (256x256)'); figure(); subplot(1,2,1); imshow(g_c,[0 1]); xlabel('a).Ruselt of Cubic convolution (a=-0.5)(512x512)'); subplot(1,2,2); imshow(g_c_diff,[0 1]); xlabel('b).Difference image (512x512)'); figure(); w = 0:0.01:pi; Xejw_3 = freqz(H_cubic,1,w); plot(w,abs(Xejw_3)); axis([0,pi,0,5]);grid; xlabel('\omega [rad] (a = -0.41)'); ylabel('|H(e^{j\omega_1}|'); f = imread('./cheer/maru_256(cheer).tif'); f_Goal = imread('./cheer/maru_512(cheer).tif'); f = mat2gray(f,[0 255]); f_Goal = mat2gray(f_Goal,[0 255]); U = 2; %拡大率 [M,N] = size(f); g_B_sp = zeros((M*U)+16,(N*U)+16); t = -1+(1/U):(1/U):1-(1/U); H_B_sp = (1/2)*(abs(t).^(3))-(abs(t).^(2)) + (2/3); t = -2+(1/U):(1/U):-1; H_B_sp = [0 (-1/6)*(abs(t).^(3))+(abs(t).^(2))-(2)*abs(t)+(4/3) H_B_sp]; t = 1:(1/U):2-(1/U); H_B_sp = [ H_B_sp (-1/6)*(abs(t).^(3))+(abs(t).^(2))-(2)*abs(t)+(4/3) 0]; for x = 1:1:M for y = 1:1:N g_B_sp((U*x)+1,(U*y)+1) = f(x,y); end end g_B_sp(1,:) = g_B_sp(U+1,:); g_B_sp((M*U)+U+1,:) = g_B_sp((M*U)+1,:); g_B_sp(:,1) = g_B_sp(:,U+1); g_B_sp(:,(M*U)+U+1) = g_B_sp(:,(M*U)+1); for x = 1:1:(M*U)+16 g_B_sp(x,:) = filter(H_B_sp,1,g_B_sp(x,:)); end for y = 1:1:(N*U)+16 g_B_sp(:,y) = filter(H_B_sp,1,g_B_sp(:,y)); end g_B = zeros((M*U),(N*U)); for x = 1:1:(M*U) for y = 1:1:(M*U) g_B(x,y) = g_B_sp(x+6,y+6); end end g_B_diff = zeros((M*U),(N*U)); for x = 1:1:(M*U) for y = 1:1:(N*U) g_B_diff(x,y) = abs(f_Goal(x,y) - g_B(x,y)); end end SAD_B = sum(sum(g_B_diff)) %SSD_B = sum(sum(g_B_diff .^2)) %MSE_B = sum(sum(g_B_diff .^2))/((M*U)*(M*U)); %PSNR_B = 10*log10((1*1)/MSE_B) figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel('a).Original Image (512x512)'); figure(); subplot(1,2,1); imshow(g_B,[0 1]); xlabel('b).Ruselt of B-spline (512x512)'); subplot(1,2,2); imshow(g_B_diff,[0 1]); xlabel('b).Difference image (512x512)'); figure(); w = 0:0.01:pi; Xejw_4 = freqz(H_B_sp,1,w); plot(w,abs(Xejw_4)); axis([0,pi,0,5]);grid; xlabel('\omega [rad] (a = -1)'); ylabel('|H(e^{j\omega_1}|');