C ++ 또는 MATLAB에서 기술 용지 알고리즘 구현


14

저는 전기 공학 학사입니다. 신호 및 이미지 처리 알고리즘 (복원, 세그먼트 화, 필터링 등)에 대한 많은 기술 논문을 읽었습니다. 이 논문에 표시된 대부분의 알고리즘은 연속 시간과 연속 주파수에 대해 정의되며 복잡한 방정식 측면에서 솔루션을 제공하는 경우가 많습니다. 해당 논문에서 얻은 결과를 재현하기 위해 C ++ 또는 MATLAB으로 처음부터 기술 논문을 어떻게 구현 하시겠습니까?

좀 더 구체적으로, Wang et al ( IEEE Trans Med Imaging. 1993; 12 (3) : 486-96 ) 의 논문 "일반적인 콘빔 재구성 알고리즘"을 보고 있었고, 어떻게 시작해야하는지 궁금했습니다. 그들의 알고리즘을 구현? 식 10은에서 재구성 된 이미지의 공식을 제공합니다. 어떻게 코드를 작성 하시겠습니까? 각 복셀을 통과하고 해당 수식을 계산하는 for 루프가 있습니까? 해당 수식에서 함수의 함수를 어떻게 코딩합니까? 임의의 지점에서 함수를 어떻게 평가 하시겠습니까?

Gonzalez와 Woods의 "Digital Image Processing"책을 읽었지만 여전히 손실이 있습니다. 나는 Numerical Recipes 책 시리즈에 대해서도 읽었습니다. 그것이 올바른 방법일까요?

연구 논문의 알고리즘 프로그래밍 경험은 무엇입니까? 팁이나 제안이 있으십니까?


1
나는 기회가있을 때 종이를 살펴볼 것이다. 그러나 나는 이것이 주어진 그래픽에서 XYZ 포인트에 관한 것이라고 생각합니다. 정점을 정의한 다음 거기서부터 작업합니다.

2
일반적으로 샘플링을 통해 신호를 이산화 한 다음 적분을 합으로 변환합니다.
nibot

그래서 적분을 샘플링하고 합계로 변환하는 것에 대해 읽었지만 integrand의 함수가 행렬로 저장된 경우 각 샘플링 지점에서 integrand를 어떻게 평가합니까?

1
데미안, 라돈 변환이 어떻게 역 투영을 통해 반전되는지 봤습니까? 이것은 내가 당신에게 관심이 있다면 설명 할 수있는 약간 더 간단한 예입니다. 게시 한 논문에 설명 된 원추형 샘플링이 아닌 평면파를 사용하는 단층 촬영에 사용됩니다. en.wikipedia.org/wiki/Radon_transform
nibot

1
@ mr-crt, 대신 dsp.SE로 마이그레이션 할 수 있습니까?
nibot

답변:


15

연속적인 시간 / 공간 / 주파수로 정의 된 신호 처리 알고리즘은 일반적으로 이산 그리드에서 신호를 샘플링하고 적분을 합 (및 미분으로 차분)으로 변환하여 구현됩니다. 공간 필터는 컨볼 루션 커널과의 컨볼 루션을 통해 구현됩니다 (즉, 가중 합).

샘플링 된 시간 영역 신호를 필터링하는 데 대한 많은 지식이 있습니다. 시간 영역 필터는 유한 임펄스 응답 필터 로 구현되며 , 여기서 현재 출력 샘플은 이전 N 개의 입력 샘플의 가중치 합으로 계산됩니다. 또는 무한 임펄스 응답 필터. 여기서 전류 출력은 이전 입력과 이전 출력 의 가중치 합계입니다 . 공식적으로, 이산 시간 필터는 라플라스 변환에 대한 이산 시간 아날로그 인 z- 변환을 사용하여 설명됩니다 . 이중 선형 변환 맵을 다른 하나의 ( 및 매트랩을).c2dd2c

임의의 지점에서 함수를 어떻게 평가 하시겠습니까?

샘플링 그리드에 직접 있지 않은 지점에서 신호 값이 필요한 경우 근처 지점에서 해당 값 을 보간 합니다. 가장 가까운 샘플을 선택하거나 가장 가까운 샘플의 가중 평균을 계산하거나 임의의 복잡한 분석 함수를 샘플링 된 데이터에 맞추고 필요한 좌표에서이 함수를 평가하는 것처럼 보간이 간단 할 수 있습니다. 균일 한 미세 그리드에 보간하는 것은 업 샘플링 입니다. 원래 (연속) 신호에 샘플링 그리드의 절반보다 미세한 세부 정보 (예 : 주파수)가 포함되어 있지 않으면 샘플링 된 버전 ( 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]');

한때 광선을 따라 밀도의 필수 요소였던 것은 이제 이산 적으로 샘플링 된 이미지의 열에 대한 합계이며, 이는 원래의 이미지를 변환 된 좌표계에 보간함으로써 발견되었습니다.


와우 @nibot, 자세한 답변 주셔서 감사합니다. 나는 "알고리즘과 데이터 구조"클래스를 가져 왔지만 거기에 제시된 자료와 과학 알고리즘을 구현하는 것 사이의 관계를 보지 못했습니다. 나는 당신이 나에게 준 링크를 읽고 더 간단한 알고리즘으로 연습을 시작합니다 (종이 대신 책에서). 다시 한번 감사드립니다
Damian

안녕하세요 Damian, 귀하의 의견을 반영하기 위해 답변을 편집했습니다. 나는 당신이 당신이 과정에서 찾거나 수치 방법 / 수치 분석에 관한 책을 찾을 것이라고 생각합니다.
nibot

답을 통해!
Victor Sorokin

@nibot : 편집 해 주셔서 감사합니다. 나는 당신이 연결 한 수치 해석 과정을 정말 좋아합니다. "유한 임펄스 응답 필터"가 보간에 연결되는 이유는 무엇입니까? 이것이 왜 EE 학생으로서의 커리큘럼의 일부가 아닌지 궁금합니다. 오 잘 감사!
Damian

@Damian : 샘플링 이론, 보간 / 데시 메이션, Z 변환, 이중 선형 변환 및 FIR / IIR 필터는 신호 및 시스템, 통신 시스템, 선형 제어 시스템 및 DSP 소개와 같은 학부 EE 수업 / 실험실에서 진행됩니다. 나는 컴퓨터 공학에서 이중 학위 프로그램의 일부로 수치 방법을 사용했습니다. 나는 EE가 일반적으로 필요하다고 생각하지 않습니다.
Eryk Sun

3

nibot의 훌륭한 설명 에 몇 가지 점만 더하면됩니다 .

  • MATLAB, Octave 또는 SciPy / NumPy와 같은 수치 컴퓨팅 환경은 C ++과 같은 일반적인 프로그래밍 언어로 모든 작업을 수행하는 것과 비교하여 많은 노력을 절약합니다. double배열과 루프로 저글링하는 것은 복잡한 숫자와 같은 데이터 유형과 손끝의 정수와 같은 연산을 갖는 것과 비교할 수 없습니다. (확실히 수행 할 수 있으며 좋은 C ++ 코드는 훨씬 빠르며 라이브러리 추상화 및 템플릿을 사용하면 상당히 깨끗하고 명확 할 수 있지만 MATLAB과 같이 시작하기가 훨씬 쉽습니다.)

  • MATLAB에는 또한 이미지 처리디지털 신호 처리 와 같은 "툴킷"이 있으며 사용자의 작업에 따라 많은 도움이 될 수 있습니다.

  • Mitra의 디지털 신호 처리 는 이산 시간, 필터, 변환 등의 기초를 배우기위한 훌륭한 책입니다.이 알고리즘은 적절한 기술 알고리즘을 수행하는 데 필요한 지식입니다.

예, Image Processing Toolboox의 설명서를 읽었습니다. 나는 매우 유용 해 보이지만 내 질문은 그런 것을 구현하는 데 중점을 두었습니다. 기본적으로 수학 알고리즘 / 수식을 가져 와서 구현하는 방법을 알고 싶었습니다 (Mathworks가 IPT를 사용하는 것처럼). 사고 패턴이나 지침에 대해 알고 싶었습니다. 나는 Mitra의 책을 볼 것이다. 감사!
Damian

1
위의 답변에 추가하기 위해 Armadillo 와 같은 C ++ 툴킷 은 Matlab 코드를 빠른 C ++ 코드로 변환하는 것을 크게 단순화 할 수 있습니다. 아르마딜로의 구문은 Matlab과 유사합니다. Armadillo의 mex 인터페이스를 통해 Matlab과 C ++ 코드를 혼합하여 사용할 수도 있습니다.
mtall

2

수치 적 방법. 일반적으로 상위 대학교 과정 및 교과서입니다.

DSP는 일반적으로 수치 적 방법과 효율적인 구현의 교차점에 가깝습니다. 효율성을 무시하면 찾고자하는 기술 논문의 방정식에 대해 "정확한"결과를 산출 할 수있는 수치 근사법이 있습니다. 때로는 샘플링 된 데이터를 처리 할 수도 있는데, 여기서 샘플링 이론은 데이터 수집 방법 (사전 필터링)과 해당 데이터를 통해 얻을 수있는 결과의 범위 또는 품질에 한계를 둘 것입니다.

때로는 Matlab, 수치 레시피 또는 다양한 이미지 / 신호 처리 라이브러리에 원하는 수치 솔루션에 대한 효율적인 알고리즘 또는 코드가 있습니다. 그러나 때로는 자신만의 롤을해야 할 수도 있으므로 다양한 수치 솔루션 방법의 수학을 이해하는 데 도움이됩니다. 그리고 그것은 그 자체로 큰 주제입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.