어떻게 gaussian blur 이미지를 사용하지 않고 어떤 내장 가우스 기능을 가지고 있는가?

StackOverflow https://stackoverflow.com/questions/1696113

문제

고 싶은 흐리게 나를 사용하여 이미지를 기본 Gaussian blur 공식입니다.내가 읽기 의 위키 문서, 지만,나는 확실하지 않을 구현하는 방법이다.

어떻게 사용할 수식을 결정하게?

나는 사용하지 않는 어떤 기능을 내장처럼 무엇을 MATLAB 가

도움이 되었습니까?

해결책

쓰고 순진한 gaussian blur 은 실제로 매우 쉽습니다.그것은 정확히 동일한 방식으로 다른 모든 회선 필터입니다.유일한 차이점은 박스 gaussian 필터는 매트릭스를 사용할.

상상 당신은 이미지의 정의는 다음과 같습니다.

 0  1  2  3  4  5  6  7  8  9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69
70 71 72 73 74 75 76 77 78 79
80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97 98 99

3x3 상자 필터 매트릭스는 다음과 같이 정의된다:

0.111 0.111 0.111
0.111 0.111 0.111
0.111 0.111 0.111

을 적용하 gaussian blur 을 수행하려면 다음과 같이 합니다:

픽셀 11 을 로드 픽셀 0, 1, 2, 10, 11, 12, 20, 21, 22.

당신은 다음을 곱 픽셀 0 에 의해 왼쪽 상단 부분의 3x3 흐림 필터입니다.픽셀의 1 의 상단 중앙 픽셀,2,3 픽셀에 의해 오른쪽 상단,픽셀 10 여 가운데 왼쪽에.

그가 그들을 모두 쓰고 그 결과를 픽셀 11.당신이 볼 수있는 픽셀 11 은 지금 평균의 자체는 주변의 픽셀이 있습니다.

Edge 경우 조금 더 복잡합니다.어떤 값을 당신에 사용할 값을의 가장자리의 질감을?한 방법이 될 수 있을 것이 가장하여 다른 측면이다.이것은 좋아 보인에 대한 이미지는 나중에 타일이다.다른 방법은 밀어 픽셀 주변 장소입니다.

그래서 왼쪽 상단할 수 있는 장소의 샘플을 다음과 같다:

 0  0  1
 0  0  1
10 10 11

나는 당신이 볼 수 있는 방법이 쉽게 확장할 수 있습형 필터링 커널을(즉,5x5 또는 9x9etc.).

의 차이 gaussian 필터링하고자 필터가는 숫자에 매트릭스입니다.Gaussian 필터를 사용하여 가우시안 배포에서 행과 열에 있습니다.

e.g 필터에 대해 정의된 임의로로(즉,이것은 가우스,하지만 아마도 멀리 떨어져 있지 않)

0.1 0.8 0.1

첫 번째 열에는 것 같지만 곱한 값으로 먼저 항목의 행니다.

0.01 0.8 0.1
0.08 
0.01 

두 번째 열의 것 같지만 이 값을 곱한 것입 0.8 행에서 위의(그리고 이렇게 계속한다).

0.01 0.08 0.01
0.08 0.64 0.08
0.01 0.08 0.01

의 결과 추가 모두 함께 위와 같아야 합니다 1.이 차이는 상기 필터 및 원래 상자 필터가 있는 픽셀을 기록 할 것이 훨씬 더 무거운 가중치로 중앙 픽셀(즉,하나는 그 위치에서 이미).흐림이 발생하기 때문에 주변의 픽셀 하 흐림으로는 픽셀,그래도하지 않습니다.를 사용하여 이런 종류의 필터를 얻을 흐리게 하지 않는 파괴로 많이 높은 주파수(즉,빠른 변화의 컬러 픽셀에서 픽셀)정보.

이러한 종류의 필터 할 수있는 많은 흥미로운 것들입니다.당신이 할 수 있는 가장자리 검색을 사용하여 이런 종류의 필터 빼 주변의 픽셀에서 현재 픽셀.이것만 남겨 정말 큰 변화는 컬러(높은 주파수)뒤에 있습니다.

편집:5x5 필터 커널이 정확하게 정의합니다.

e.g 면 당신의 행 0.1 0.2 0.4 0.2 0.1 다음을 곱하면 각각의 가치들에 의 첫 번째 항목의 양식을 열고 다음을 곱하여 각 두 번째 항목을 형성하는 두 번째 열에 당신은 끝날 것으로의 여과기

0.01 0.02 0.04 0.02 0.01
0.02 0.04 0.08 0.04 0.02
0.04 0.08 0.16 0.08 0.04
0.02 0.04 0.08 0.04 0.02
0.01 0.02 0.04 0.02 0.01

일부는 임의의 위치를 볼 수 있는 위치 0 0 는 간단하 0.1*0.1.위치 0,2 0.1*0.4,2,2 0.4*0.4 위치 및 1,2 0.2*0.4.

나는 당신에게 좋은 충분한 설명이 있습니다.

다른 팁

커널을 계산하기 위해 C#에서 사용한 코드의 의사 코드는 다음과 같습니다. 그래도 최종 조건을 올바르게 처리한다고 감히 말하지 않습니다.

double[] kernel = new double[radius * 2 + 1];
double twoRadiusSquaredRecip = 1.0 / (2.0 * radius * radius);
double sqrtTwoPiTimesRadiusRecip = 1.0 / (sqrt(2.0 * Math.PI) * radius);
double radiusModifier = 1.0;

int r = -radius;
for (int i = 0; i < kernel.Length; i++)
{
    double x = r * radiusModifier;
    x *= x;
    kernel[i] =
    sqrtTwoPiTimesRadiusRecip * Exp(-x * sqrtTwoPiTimesRadiusRecip);
    r++;
}

double div = Sum(kernel);
for (int i = 0; i < kernel.Length; i++)
{
    kernel[i] /= div;
}

이것이 도움이되기를 바랍니다.

Wikipedia 기사에서 논의 된 필터 커널을 사용하려면 구현해야합니다 (이산) 회선. 아이디어는 값의 작은 매트릭스 (커널)를 가지고 있고,이 커널을 이미지의 픽셀에서 픽셀로 이동하여 (예 : 매트릭스의 중심이 픽셀에 있도록), 매트릭스 요소에 겹친 이미지를 곱합니다. 요소는 결과의 모든 값을 합계하고 이전 픽셀 값을이 합으로 바꾸십시오.

가우스 블러는 2D 컨볼 루션 대신 2 개의 1D 컨볼 루션 (1 개의 수직 및 1 개의 수평)으로 분리 될 수 있으며, 이는 약간의 속도를 높입니다.

당신이 이것을 제한하고 싶은지 확실하지 않습니다. 에게 특정 기술이지만 그렇지 않은 경우 SVG (scalablevectorgraphics) 가우스 블러의 구현이 있습니다. 나는 그것이 픽셀을 포함한 모든 프리미티브에 적용된다고 생각합니다. SVG는 개방형 표준이며 광범위하게 구현된다는 이점이 있습니다.

가우스 커널은 분리 가능한 커널입니다.
따라서 필요한 것은 분리 가능한 2D 컨볼 루션을 지원하는 기능입니다. ImageConvolutionSeparableKernel().

일단 당신이 그것을 가지고 있다면, 필요한 모든 것은 1D 가우시안 커널을 생성하고 다음과 같이 함수로 보내는 래퍼입니다. ImageConvolutionGaussianKernel().

이 코드는 SIMD (SSE) 및 멀티 스레딩 (OpenMP)이 가속화 한 2D 이미지 컨볼 루션의 간단한 C 구현입니다.

전체 프로젝트는 - 이미지 컨볼 루션 -Github.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top