<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="bbPress/1.0.2" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>k-Wave User Forum &#187; Topic: 2D image reconstruction using &#039;universal back-projection algorithm&#039;</title>
		<link>http://www.k-wave.org/forum/topic/2d-image-reconstruction-using-universal-back-projection-algorithm</link>
		<description>Support for the k-Wave MATLAB toolbox</description>
		<language>en-US</language>
		<pubDate>Wed, 13 May 2026 01:02:16 +0000</pubDate>
		<generator>http://bbpress.org/?v=1.0.2</generator>
		<textInput>
			<title><![CDATA[Search]]></title>
			<description><![CDATA[Search all topics from these forums.]]></description>
			<name>q</name>
			<link>http://www.k-wave.org/forum/search.php</link>
		</textInput>
		<atom:link href="http://www.k-wave.org/forum/rss/topic/2d-image-reconstruction-using-universal-back-projection-algorithm" rel="self" type="application/rss+xml" />

		<item>
			<title>james luo on "2D image reconstruction using &#039;universal back-projection algorithm&#039;"</title>
			<link>http://www.k-wave.org/forum/topic/2d-image-reconstruction-using-universal-back-projection-algorithm#post-8610</link>
			<pubDate>Sun, 11 Sep 2022 09:37:11 +0000</pubDate>
			<dc:creator>james luo</dc:creator>
			<guid isPermaLink="false">8610@http://www.k-wave.org/forum/</guid>
			<description>&#60;p&#62;Dear Prof. Ben Cox and Prof. Bradley Treeby,&#60;br /&#62;
     I meet the same problem liked Tho and failed to use 2D universal back-projection image reconstruction successfully, could you please kindly share me how you did it？ My email: &#60;a href=&#34;mailto:1336459011@qq.com&#34;&#62;1336459011@qq.com&#60;/a&#62;&#60;br /&#62;
     Thank you !&#60;br /&#62;
     Best wishes,&#60;br /&#62;
     James.
&#60;/p&#62;</description>
		</item>
		<item>
			<title>bencox on "2D image reconstruction using &#039;universal back-projection algorithm&#039;"</title>
			<link>http://www.k-wave.org/forum/topic/2d-image-reconstruction-using-universal-back-projection-algorithm#post-7195</link>
			<pubDate>Wed, 22 Jan 2020 16:01:42 +0000</pubDate>
			<dc:creator>bencox</dc:creator>
			<guid isPermaLink="false">7195@http://www.k-wave.org/forum/</guid>
			<description>&#60;p&#62;Hi Tho, &#60;/p&#62;
&#60;p&#62;Sorry for the delay in replying. There is a 2D version of the universal backprojection algorithm derived by Burgholzer et al in this paper: Burgholzer et al. &#34;Temporal back-projection algorithms for photoacoustic tomography with integrating line detectors.&#34; Inverse Problems 23.6 (2007): S65.&#60;/p&#62;
&#60;p&#62;Hope that helps.&#60;/p&#62;
&#60;p&#62;Ben
&#60;/p&#62;</description>
		</item>
		<item>
			<title>Tho on "2D image reconstruction using &#039;universal back-projection algorithm&#039;"</title>
			<link>http://www.k-wave.org/forum/topic/2d-image-reconstruction-using-universal-back-projection-algorithm#post-7131</link>
			<pubDate>Mon, 18 Nov 2019 23:04:19 +0000</pubDate>
			<dc:creator>Tho</dc:creator>
			<guid isPermaLink="false">7131@http://www.k-wave.org/forum/</guid>
			<description>&#60;p&#62;Dear Prof. Ben Cox and Prof. Bradley Treeby, Dear colleagues,&#60;/p&#62;
&#60;p&#62;I am doing 2D image reconstruction with point sensor ring array using 'universal back-projection algorithm (UBP). As you know, the UBP in Prof. Lihong Wang's article 'Universal back-projection algorithm for photoacoustic computed tomography' was obtained in 3D, so I did a simplification of his reconstruction equation from 3D to 2D (To be honest, I am not 100% sure if I did it correctly. But here on the forum, I cannot post equations and pics).&#60;/p&#62;
&#60;p&#62;I used k-wave tool box to generate the forward date, from which I did the image reconstruction. However, my UBP reconstruction has some wired fluctuations at the image transition parts compared to time reversal image reconstruction, which I really don't know the reason. Increasing the number of sensors and decreasing the grid size do not alleviate the above mention reconstruction fluctuations much. I am running out thoughts now!&#60;/p&#62;
&#60;p&#62;Below, I post my matlab code. Could anyone please have a look at my code to see where I may not do correctly?&#60;/p&#62;
&#60;p&#62;If anyone has done 2D universal back-projection image reconstruction successfully, could you  please kindly share me how you did it？&#60;/p&#62;
&#60;p&#62;In case you need further input, my email: &#60;a href=&#34;mailto:isabelle.thomas19950321@gmail.com&#34;&#62;isabelle.thomas19950321@gmail.com&#60;/a&#62;.&#60;/p&#62;
&#60;p&#62;Thank you all!&#60;/p&#62;
&#60;p&#62;Best wishes,&#60;/p&#62;
&#60;p&#62;Isabelle&#60;/p&#62;
&#60;p&#62;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&#60;br /&#62;
                                       MATLAB CODE&#60;br /&#62;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&#60;/p&#62;
&#60;p&#62;clearvars&#60;br /&#62;
close all&#60;/p&#62;
&#60;p&#62;% load the initial pressure distribution as shepp-Logan phantom&#60;br /&#62;
p0_magnitude = 1;&#60;/p&#62;
&#60;p&#62;grid_size_SL = 100;&#60;br /&#62;
p = p0_magnitude.*phantom('Modified Shepp-Logan',grid_size_SL);&#60;/p&#62;
&#60;p&#62;tot_grid_size = grid_size_SL + 100;  %% the extra 100 grid points are used for PML and placing transducers&#60;br /&#62;
p0 = zeros(tot_grid_size);&#60;/p&#62;
&#60;p&#62;p0(51:tot_grid_size-50,51:tot_grid_size-50) = p;&#60;/p&#62;
&#60;p&#62;% assign the grid size and create the computational grid&#60;br /&#62;
PML_size = 20;              % size of the PML in grid points&#60;/p&#62;
&#60;p&#62;Nx = tot_grid_size;    % number of grid points in the x direction&#60;br /&#62;
Ny = tot_grid_size;    % number of grid points in the y direction&#60;br /&#62;
x= 10e-3;                  % total grid size [m]&#60;br /&#62;
y = 10e-3;                  % total grid size [m]&#60;br /&#62;
dx = x / Nx;                % grid point spacing in the x direction [m]&#60;br /&#62;
dy = y / Ny;                % grid point spacing in the y direction [m]&#60;br /&#62;
kgrid = kWaveGrid(Nx, dx, Ny, dy);&#60;/p&#62;
&#60;p&#62;% smooth the initial pressure distribution and restore the magnitude&#60;br /&#62;
p0 = smooth(kgrid, p0, true);&#60;/p&#62;
&#60;p&#62;% assign to the source structure&#60;br /&#62;
source.p0 = p0;&#60;/p&#62;
&#60;p&#62;% define the properties of the propagation medium&#60;br /&#62;
sound_speed = 1500;&#60;br /&#62;
medium.sound_speed = sound_speed;  % [m/s]&#60;/p&#62;
&#60;p&#62;% define a centered Cartesian circular sensor&#60;br /&#62;
sensor_radius = 4.5e-3;     % [m]&#60;br /&#62;
sensor_angle = 2*pi;      % [rad]&#60;br /&#62;
sensor_pos = [0, 0];        % [m]&#60;br /&#62;
num_sensor_points = 100;&#60;br /&#62;
cart_sensor_mask = makeCartCircle(sensor_radius, num_sensor_points, sensor_pos, sensor_angle);&#60;/p&#62;
&#60;p&#62;% assign to sensor structure&#60;br /&#62;
sensor.mask = cart_sensor_mask;&#60;/p&#62;
&#60;p&#62;% create the time array&#60;br /&#62;
kgrid.makeTime(medium.sound_speed);&#60;/p&#62;
&#60;p&#62;% set the input options&#60;br /&#62;
input_args = {'Smooth', false, 'PMLInside', true, 'PlotPML', true};&#60;/p&#62;
&#60;p&#62;% run the simulation&#60;br /&#62;
sensor_data = kspaceFirstOrder2D(kgrid, medium, source, sensor, input_args{:});&#60;/p&#62;
&#60;p&#62;%% back projection&#60;/p&#62;
&#60;p&#62;t_array = kgrid.t_array;&#60;br /&#62;
dt = kgrid.dt;&#60;br /&#62;
fs = 1/dt;&#60;/p&#62;
&#60;p&#62;np = length(t_array);&#60;br /&#62;
NFFT = 2^nextpow2(np);&#60;/p&#62;
&#60;p&#62;f_vec = fs*linspace(0,1,NFFT);&#60;br /&#62;
w_vec = 2*pi*f_vec;&#60;br /&#62;
k_vec = ifftshift(2*pi*f_vec/(sound_speed));&#60;/p&#62;
&#60;p&#62;weighting_omega = 0;&#60;br /&#62;
p0_recon = zeros(Nx, Ny);&#60;/p&#62;
&#60;p&#62;for ii = 1:num_sensor_points&#60;/p&#62;
&#60;p&#62;    x_ii = cart_sensor_mask(1,ii);&#60;br /&#62;
    y_ii = cart_sensor_mask(2,ii);&#60;/p&#62;
&#60;p&#62;    distance_x_square = (kgrid.x - x_ii).^2;&#60;br /&#62;
    distance_y_square = (kgrid.y - y_ii).^2;&#60;br /&#62;
    distance_xy = sqrt(distance_x_square + distance_y_square);&#60;br /&#62;
    distance_xy_index = round(distance_xy/(sound_speed*dt));&#60;br /&#62;
    distance_xy_index(~distance_xy_index)=1; &#60;/p&#62;
&#60;p&#62;    p_ii = sensor_data(ii,:);&#60;/p&#62;
&#60;p&#62;    p_ii_derivative0 = ifft((1i*k_vec).*fft(p_ii,NFFT));&#60;br /&#62;
    p_ii_derivative = real((p_ii_derivative0(1:np)));&#60;/p&#62;
&#60;p&#62;    bp_ii = (p_ii - sound_speed.*t_array.*p_ii_derivative);&#60;br /&#62;
    p0_ii = bp_ii(distance_xy_index);&#60;/p&#62;
&#60;p&#62;    %%% weighting angle&#60;br /&#62;
    weighting_arc_ii = (2*pi*sensor_radius)/num_sensor_points;&#60;br /&#62;
    weighting_phy_ii = 2*pi/num_sensor_points;&#60;br /&#62;
    weighting_omega_ii = weighting_arc_ii*(1./((distance_x_square + distance_y_square).*sensor_radius).*(-x_ii.*kgrid.x - y_ii.*kgrid.y + sensor_radius.^2));&#60;br /&#62;
    weighting_omega_ii(isnan(weighting_omega_ii)) = weighting_phy_ii;&#60;br /&#62;
    weighting_omega_ii(isinf(weighting_omega_ii)) = weighting_phy_ii;&#60;/p&#62;
&#60;p&#62;    p0_ii = weighting_omega_ii.*p0_ii;&#60;/p&#62;
&#60;p&#62;    weighting_omega = weighting_omega + weighting_omega_ii;  &#60;/p&#62;
&#60;p&#62;    p0_recon = p0_recon + p0_ii;&#60;/p&#62;
&#60;p&#62;end&#60;/p&#62;
&#60;p&#62;p0_recon0 = p0_recon./(2*pi);&#60;/p&#62;
&#60;p&#62;figure(1)  %% reconstructed image&#60;br /&#62;
imagesc(kgrid.y_vec*1000,kgrid.x_vec*1000,p0_recon0,[-1,1])   %./max(p0_recon(:))&#60;br /&#62;
axis image&#60;br /&#62;
colorbar&#60;br /&#62;
ylabel('x(mm)');&#60;br /&#62;
xlabel('y(mm)');&#60;/p&#62;
&#60;p&#62;slice_pos = 4.5e-3; %% comparison with original image amplitude along a horizontal line&#60;/p&#62;
&#60;p&#62;figure(2)&#60;br /&#62;
plot(kgrid.y_vec,p0(round(slice_pos/kgrid.dx),:))&#60;br /&#62;
hold on&#60;br /&#62;
plot(kgrid.y_vec,p0_recon0(round(slice_pos/kgrid.dx),:))&#60;br /&#62;
hold off&#60;br /&#62;
axis tight&#60;br /&#62;
xlabel('y(mm)');&#60;br /&#62;
ylabel('Reconstructed amplitude');
&#60;/p&#62;</description>
		</item>

	</channel>
</rss>
