연속적인 시간 / 공간 / 주파수로 정의 된 신호 처리 알고리즘은 일반적으로 이산 그리드에서 신호를 샘플링하고 적분을 합 (및 미분으로 차분)으로 변환하여 구현됩니다. 공간 필터는 컨볼 루션 커널과의 컨볼 루션을 통해 구현됩니다 (즉, 가중 합).
샘플링 된 시간 영역 신호를 필터링하는 데 대한 많은 지식이 있습니다. 시간 영역 필터는 유한 임펄스 응답 필터 로 구현되며 , 여기서 현재 출력 샘플은 이전 N 개의 입력 샘플의 가중치 합으로 계산됩니다. 또는 무한 임펄스 응답 필터. 여기서 전류 출력은 이전 입력과 이전 출력 의 가중치 합계입니다 . 공식적으로, 이산 시간 필터는 라플라스 변환에 대한 이산 시간 아날로그 인 z- 변환을 사용하여 설명됩니다 . 이중 선형 변환 맵을 다른 하나의 ( 및 매트랩을).c2d
d2c
임의의 지점에서 함수를 어떻게 평가 하시겠습니까?
샘플링 그리드에 직접 있지 않은 지점에서 신호 값이 필요한 경우 근처 지점에서 해당 값 을 보간 합니다. 가장 가까운 샘플을 선택하거나 가장 가까운 샘플의 가중 평균을 계산하거나 임의의 복잡한 분석 함수를 샘플링 된 데이터에 맞추고 필요한 좌표에서이 함수를 평가하는 것처럼 보간이 간단 할 수 있습니다. 균일 한 미세 그리드에 보간하는 것은 업 샘플링 입니다. 원래 (연속) 신호에 샘플링 그리드의 절반보다 미세한 세부 정보 (예 : 주파수)가 포함되어 있지 않으면 샘플링 된 버전 ( Nyquist-Shannon 샘플링 정리 ) 에서 연속 기능을 완벽하게 재구성 할 수 있습니다 . 2D로 보간하는 방법에 대한 예는쌍 선형 보간 .
Matlab에서는 1D 또는 정기적으로 샘플링 된 2D 데이터를 사용 interp1
하거나 interp2
보간하거나 (각각) griddata
불규칙적 으로 샘플링 된 2D 데이터를 보간 할 수 있습니다 .
각 복셀을 통과하고 해당 수식을 계산하는 for 루프가 있습니까?
예, 정확히
Matlab은 행렬과 벡터 (즉, 다차원 배열)에서 작동하도록 설계 되었기 때문에 명시적인 for-loop를 통해이 작업을 수행하지 않아도됩니다. Matlab에서는 이것을 "벡터화"라고합니다. 확실한 적분으로 근사 할 수있다 sum
, cumsum
, trapz
, cumtrapz
, 등
Gonzalez와 Woods의 "Digital Image Processing"책을 읽었지만 여전히 손실이 있습니다. 나는 Numerical Recipes 책 시리즈에 대해서도 읽었습니다. 그것이 올바른 방법일까요?
예, Numerical Recipes 는 훌륭한 시작이 될 것입니다. 그것은 매우 실용적이며 당신이 필요로하는 대부분의 수치 방법을 다룹니다. Matlab은 이미 필요한 모든 것을 구현하지만 Numerical Recipes 는 훌륭한 배경을 제공합니다.
나는 "알고리즘과 데이터 구조"클래스를 가져 왔지만 거기에 제시된 자료와 과학 알고리즘을 구현하는 것 사이의 관계를 보지 못했습니다.
"알고리즘 및 데이터 구조"과정에서 처리되는 자료는 목록, 배열, 트리 및 정수 또는 문자열을 포함하는 그래프와 같은 구조와 정렬 및 선택과 같은 연산에 집중되는 경향이 있습니다. 일반적으로 올바른 결과는 하나뿐입니다. 과학 알고리즘에 관해서는 이것은 이야기의 절반에 지나지 않습니다. 나머지 절반은 실수와 분석 함수를 추정하는 방법에 관한 것입니다. 당신은 "수치 방법"(또는 "수치 해석"의 과정에서이를 찾을 수 있습니다, 같은 이 하나-특수 함수를 추정하는 방법, 적분 및 미분을 추정하는 방법 등-여기서 주요 작업 중 하나는 결과의 정확성을 추정하는 것이며, 공통적 인 패턴 중 하나는 루틴을 반복하는 것입니다. 충분히 정확해질 때까지 추정하십시오. ( sin(x)
어떤 값을 추정하는 것만 큼 간단한 일을하는 방법을 Matlab이 어떻게 알고 있는지 스스로에게 물어볼 수도 있습니다 x
.)
간단한 예로, Matlab에서 이미지의 라돈 변환을 계산하는 간단한 스크립트가 있습니다. 라돈 변환은 일련의 투영 각도에 걸쳐 이미지를 투영합니다. 임의의 각도를 따라 투영을 계산하는 대신 대신을 사용하여 전체 이미지를 회전시켜 imrotate
투영이 항상 수직이되도록합니다. 행렬의는 각 열의 합계를 포함하는 벡터를 반환하기 sum
때문에 간단히을 사용하여 투영을 취할 수 있습니다 sum
.
imrotate
원하는 경우을 사용하여 직접 작성할 수 있습니다 interp2
.
%%# Home-made Radon Tranform
%# load a density map (image).
A = phantom;
n_pixels = size(A, 1); %# image width (assume square)
%# At what rotation angles do we want to take projections?
n_thetas = 101;
thetas = linspace(0, 180, n_thetas);
result = zeros(n_thetas, n_pixels);
%# Loop over angles
for ii=1:length(thetas)
theta = thetas(ii);
rotated_image = imrotate(A, theta, 'crop');
result(ii, :) = sum(rotated_image);
end
%# display the result
imagesc(thetas, 1:n_pixels, result.');
xlabel('projection angle [degrees]');
한때 광선을 따라 밀도의 필수 요소였던 것은 이제 이산 적으로 샘플링 된 이미지의 열에 대한 합계이며, 이는 원래의 이미지를 변환 된 좌표계에 보간함으로써 발견되었습니다.