언어/C

C언어 영상처리 정리 2 - UpDownsampling, Histogram, HE....

이게될까 2024. 4. 15. 01:01
728x90
728x90

8강 - Filter (Denoising)

C에서 저 <<를 한번도 사용해본적이 없어서 그런지 아리까리 하네요..

C언어에서 >><< 연산자는 비트 연산자로, 각각 오른쪽 시프트와 왼쪽 시프트 연산을 수행합니다. 이 연산자들은 비트 단위로 데이터를 조작할 때 사용되며, 주로 성능 최적화, 하드웨어 레벨에서의 조작, 비트 필드 작업 등에 활용됩니다.

왼쪽 시프트 연산자 (<<)

왼쪽 시프트 연산자 <<는 지정된 수만큼 비트를 왼쪽으로 이동시킵니다. 이 때, 왼쪽 끝에서 넘치는 비트는 버려지고, 오른쪽 끝에는 0이 채워집니다. 이 연산은 각 시프트마다 숫자를 2배씩 증가시키는 효과가 있습니다.

예시:

#include <stdio.h>

int main() {
    int a = 3;  // 2진수로 0000 0011
    int result = a << 1;  // 왼쪽으로 1비트 시프트

    printf("Original: %d, After shift: %d\n", a, result);
    return 0;
}

이 코드는 3을 왼쪽으로 1 비트 시프트합니다. 결과는 6이 됩니다 (0000 0110).

오른쪽 시프트 연산자 (>>)

오른쪽 시프트 연산자 >>는 지정된 수만큼 비트를 오른쪽으로 이동시킵니다. 이 때, 오른쪽 끝으로 넘치는 비트는 버려지고, 왼쪽 끝의 새로운 비트는 부호 비트(음수인 경우 1, 양수인 경우 0)로 채워집니다. 이 연산은 각 시프트마다 숫자를 2로 나누는 효과가 있습니다.

예시:

#include <stdio.h>

int main() {
    int a = 10;  // 2진수로 0000 1010
    int result = a >> 1;  // 오른쪽으로 1비트 시프트

    printf("Original: %d, After shift: %d\n", a, result);
    return 0;
}

이 코드는 10을 오른쪽으로 1 비트 시프트합니다. 결과는 5가 됩니다 (0000 0101).

이 연산자들은 데이터를 빠르게 조작할 수 있는 강력한 도구입니다. 특히 임베디드 시스템, 그래픽 처리, 비트 마스킹 등의 작업에서 유용하게 사용됩니다.

그럼 이 시프트 연산자가 곱하기 나누기 보다 빠른가...?

네, 맞습니다. 시프트 연산자(>><<)는 곱하기나 나누기 연산보다 일반적으로 더 빠릅니다. 이는 하드웨어 수준에서의 연산 방식 때문입니다.

시프트 연산자의 성능

시프트 연산자들은 CPU 내에서 매우 간단하고 효율적으로 구현됩니다. 비트를 이동시키는 것은 전기적으로 간단한 연산이며, 대부분의 현대 프로세서는 이를 하드웨어 수준에서 지원합니다. 따라서 시프트 연산은 매우 빠른 실행 시간을 가지고, CPU 클록 사이클의 소수만을 사용합니다.

곱셈과 나눗셈 연산자의 성능

반면, 곱셈과 나눗셈은 좀 더 복잡한 연산입니다. 특히 나눗셈은 곱셈보다 더 많은 자원을 소모하며, 비트 연산이나 덧셈보다 훨씬 느립니다. 현대의 CPU는 곱셈을 효율적으로 처리할 수 있도록 설계되어 있지만, 나눗셈은 여전히 상대적으로 느린 연산입니다.

예시와 적용

예를 들어, 어떤 수에 2를 곱하는 연산은 왼쪽 시프트 연산(<<)을 사용해 표현할 수 있으며, 이는 단일 시프트 연산으로 처리될 수 있습니다. 마찬가지로, 2로 나누는 연산은 오른쪽 시프트 연산(>>)으로 처리할 수 있습니다. 이러한 연산들은 곱셈이나 나눗셈 연산을 사용하는 것보다 빠릅니다.

int a = 10;
int multiply = a << 1;  // 10 * 2
int divide = a >> 1;    // 10 / 2

결론

이처럼, 곱하기나 나누기가 필요한 경우, 특히 상수 곱셈이나 나눗셈에 대해 시프트 연산자를 사용하면 성능을 최적화할 수 있습니다. 하지만 이는 2의 거듭제곱에 대해서만 적용될 수 있습니다. 복잡한 수학 연산이나 2의 거듭제곱이 아닌 수에 대한 곱셈이나 나눗셈이 필요한 경우에는 기존의 곱셈 또는 나눗셈 연산을 사용해야 합니다.

이거는 어쩌다가 값을 확 변동시켜버리는 흩뿌리듯 이상해지겠네요

restoration : 복원

값이 툭툭 튀는 것을 잡아줍니다. 오름 차순 후로 정렬 후 가운데 값을 사용하는 것으로 업데이트합니다.

외각은 흠.... padding이 되어있으면 오히려 오류가 안나겠네요... 제 코드는 0으로 채우는게 아니니까

여기선 이상한 값도 결과에 기여하는 문제는 있지만 흠 -> 그 소금 후추 노이즈에서 prob가 작으면 이걸 쓰고, prob가 크면 median을 써야할지...?

솔트 앤 페퍼 노이즈(salt and pepper noise) 또는 임펄스 노이즈는 이미지에 무작위로 분포한 매우 밝거나 매우 어두운 픽셀들이 나타나는 현상입니다. 이러한 노이즈는 이미지 데이터의 극단적인 값 변경을 일으키기 때문에 일반적인 평균 필터(mean filter)나 가우시안 필터(Gaussian filter) 등을 사용하여 제거하기 어렵습니다. 이런 필터들은 노이즈가 포함된 픽셀을 평균화할 때, 노이즈의 극단값이 결과에 영향을 미칠 수 있기 때문입니다.

미디언 필터 (Median Filter)

미디언 필터는 임펄스 노이즈 제거에 효과적인 방법 중 하나입니다. 미디언 필터는 주변 픽셀 값들을 정렬한 후 중간값을 선택하여 현재 픽셀의 값을 대체합니다. 이 방식은 픽셀 값들의 극단적인 변화를 무시하고, 더 일반적이고 대표적인 값으로 픽셀을 대체하기 때문에 솔트 앤 페퍼 노이즈에 특히 효과적입니다.

평균 필터 (Mean Filter)

평균 필터는 주변 픽셀 값들의 산술 평균을 계산하여 현재 픽셀의 값을 대체합니다. 이 필터는 일반적인 잡음 제거에 유용하지만, 임펄스 노이즈와 같이 극단적인 값의 노이즈가 포함된 경우에는 노이즈를 더 확산시킬 수 있습니다. 평균 필터는 노이즈의 영향을 받아 이미지가 흐릿해질 수 있습니다.

노이즈 확률 (Probability of Noise)

노이즈가 발생할 확률이 높을수록 (즉, 이미지 내 많은 픽셀이 노이즈 영향을 받을수록) 미디언 필터가 더 효과적입니다. 이는 미디언 필터가 극단값을 제거하는 능력 때문입니다. 반면, 노이즈의 발생 확률이 낮다면 평균 필터를 사용해도 비교적 안전할 수 있으며, 이 경우에는 이미지의 세부 사항을 더 부드럽게 유지할 수 있습니다.

결론

따라서 노이즈의 확률이 높다면 (예를 들어, 솔트 앤 페퍼 노이즈가 많은 영역에서) 미디언 필터가 더 적합합니다. 노이즈 확률이 낮을 경우에는 평균 필터를 사용해도 괜찮지만, 그래도 노이즈의 성격에 따라 미디언 필터가 안전한 선택일 수 있습니다. 노이즈 유형과 정도에 따라 적절한 필터를 선택하는 것이 중요합니다.

그럼 GPT가 추천하는 필터는?!

이미지 처리에서 사용할 수 있는 다양한 필터들이 있으며, 각각 특정 종류의 노이즈와 상황에 따라 장단점이 있습니다. 여기서 몇 가지 일반적인 필터들을 소개하고, 각각의 용도와 추천 상황에 대해 설명하겠습니다.

1. 평균 필터 (Mean Filter)

  • 설명: 주변 픽셀의 평균 값을 사용하여 현재 픽셀 값을 대체합니다.
  • 장점: 간단하고, 연산 속도가 빠릅니다.
  • 단점: 에지(edge)가 흐려질 수 있으며, 극단적인 노이즈에는 효과가 제한적입니다.
  • 적합한 사용 경우: 이미지에서 무작위 노이즈를 감소시키고 싶을 때, 그러나 에지 보존이 중요하지 않은 경우.

2. 미디언 필터 (Median Filter)

  • 설명: 주변 픽셀들을 크기 순으로 정렬한 후 중앙값을 선택하여 현재 픽셀을 대체합니다.
  • 장점: 솔트 앤 페퍼 노이즈와 같은 극단적 노이즈 제거에 매우 효과적입니다. 에지 보존에도 비교적 좋습니다.
  • 단점: 계산 비용이 평균 필터보다 높습니다.
  • 적합한 사용 경우: 솔트 앤 페퍼 노이즈 제거, 일반적인 노이즈 제거에서도 사용 가능하며 에지를 어느 정도 보존하면서 노이즈를 제거하고 싶을 때.

3. 가우시안 필터 (Gaussian Filter)

  • 설명: 가우스 함수를 기반으로 한 가중치 평균을 사용하여 픽셀을 스무딩합니다. 이 필터는 픽셀 주위의 거리에 따라 가중치를 다르게 적용합니다.
  • 장점: 자연스러운 이미지 스무딩 효과, 에지 근처에서도 성능이 우수합니다.
  • 단점: 극단적인 노이즈에는 그다지 효과적이지 않습니다.
  • 적합한 사용 경우: 자연스러운 스무딩이 필요하거나, 에지를 손상시키지 않으면서 전반적인 이미지 노이즈를 줄이고자 할 때.

추천

  • 일반적인 노이즈와 솔트 앤 페퍼 노이즈 처리: 미디언 필터를 추천합니다. 이는 극단적인 노이즈 제거에 효과적이며, 에지도 어느 정도 보존할 수 있습니다.
  • 자연스럽고 부드러운 스무딩: 가우시안 필터를 사용하면 좋습니다. 이는 더욱 자연스러운 이미지 처리에 적합하며, 보다 섬세한 스무딩이 필요할 때 유용합니다.

각 필터는 특정 상황과 요구 사항에 따라 선택할 수 있으며, 때로는 여러 필터를 조합하여 사용하기도 합니다. 노이즈의 종류와 이미지의 특성을 고려하여 가장 적절한 필터를 선택하는 것이 중요합니다.

별 다른 내용이 없네요...

가우시안 분포, 필터를 위한 초석

필터를 더해서 사용할 수 있다.

이건 금방 구현할 수 있겠네요

Padding

주변 값을 어떻게 채울지!

GPT가 말해주는 여러가지 필터들!

이미지 처리에서 사용되는 다양한 필터링 기법이 있으며, 각기 다른 특성과 용도를 가지고 있습니다. 다음은 다섯 가지 추가적인 필터 유형에 대한 설명과 각각의 장단점입니다.

1. 라플라시안 필터 (Laplacian Filter)

  • 설명: 라플라시안 필터는 이미지의 두 번째 공간 파생값을 이용하여 에지 강화에 주로 사용됩니다. 이 필터는 이미지의 세밀한 부분과 에지에 대한 대비를 증가시키는 데 효과적입니다.
  • 장점: 에지 강화에 매우 효과적이며, 세밀한 이미지 디테일을 부각시킬 수 있습니다.
  • 단점: 노이즈에 매우 민감하며, 필터링 과정에서 노이즈가 강화될 수 있습니다.
  • 적합한 사용 경우: 에지 검출과 이미지 세부 정보 강화가 필요할 때 사용하지만, 노이즈가 적은 이미지에서 주로 사용됩니다.

2. 소벨 필터 (Sobel Filter)

  • 설명: 소벨 필터는 이미지의 x와 y 방향의 1차 미분을 이용하여 에지를 감지합니다. 이는 주로 수평 및 수직 방향의 에지 강조에 사용됩니다.
  • 장점: 간단하고 효과적인 에지 감지 방법을 제공하며, 에지의 방향성을 파악하기에 좋습니다.
  • 단점: 대각선 방향의 에지 감지에는 다소 제한적일 수 있습니다.
  • 적합한 사용 경우: 에지 강화 및 감지가 중요한 이미지 처리에서 활용됩니다.

3. 슈마흐 필터 (Scharr Filter)

  • 설명: 슈마흐 필터는 소벨 필터와 유사하지만, 대각선 에지 감지에 더 강화된 민감도를 제공합니다.
  • 장점: 더 정확하고 민감한 에지 감지가 가능하며, 에지 방향에 덜 민감합니다.
  • 단점: 계산 비용이 소벨 필터보다 높을 수 있습니다.
  • 적합한 사용 경우: 고해상도 이미지에서 더 세밀한 에지 감지가 필요할 때 사용됩니다.

4. 빌라트럴 필터 (Bilateral Filter)

  • 설명: 빌라트럴 필터는 가우시안 필터를 확장한 형태로, 가까운 픽셀 뿐만 아니라 픽셀 간의 강도 차이를 고려하여 스무딩을 진행합니다.
  • 장점: 에지를 보존하면서 이미지를 효과적으로 스무딩할 수 있습니다.
  • 단점: 계산 비용이 매우 높고 처리 속도가 느립니다.
  • 적합한 사용 경우: 에지 보존이 중요한 동시에 노이즈 제거가 필요한 경우에 적합합니다.

5. 와이너 필터 (Wiener Filter)

  • 설명: 와이너 필터는 주파수 영역에서 이미지를 복원하는 데 사용되며, 이미지의 원래 신호를 복원하고자 할 때 주로 사용됩니다.
  • 장점: 블러링과 노이즈를 효과적으로 제거할 수 있으며, 이미지 복원에 효과적입니다.
  • 단점: 모델 파라미터를 정확히 설정해야 하며, 잘못 설정할 경우 복원 효과가 떨어질 수 있습니다.
  • 적합한 사용 경우: 이미지가 블러링되었거나, 노이즈가 섞인 경우 이미지를 복원하는데 사용됩니다.

이와 같은 필터들은 각각 특정 상황에 맞춰서 선택되어야 합니다. 처리해야 할 이미지의 특성과 요구하는 결과에 따라 가장 적절한 필터를 선택하는 것이 중요합니다.

응...

 

앞서 설명한 다섯 가지 필터 각각을 C 코드로 작성하는 것은 상당히 복잡할 수 있습니다. 여기서는 각 필터의 기본적인 로직을 C 언어로 구현하는 방법을 간단히 설명하겠습니다. 이들을 실제 프로젝트에 통합하기 전에는 추가적인 최적화와 에러 처리를 고려해야 합니다.

1. 소벨 필터 (Sobel Filter)

소벨 필터는 에지 감지에 주로 사용되며, x와 y 방향의 미분을 기반으로 합니다.

2. 빌라트럴 필터 (Bilateral Filter)

빌라트럴 필터는 이미지의 부드러움을 유지하면서 에지를 보존합니다. 이 예제는 그 기본적인 형태만 다룹니다.

3. 슈마흐 필터 (Scharr Filter)

슈마흐 필터의 구현은 소벨 필터와 유사하지만, 특정 방향에 대한 감도가 더 높습니다. 여기에서는 구현을 생략하겠습니다.

4. 라플라시안 필터 (Laplacian Filter)

라플라시안 필터는 두 번째 미분을 사용하여 이미지에서 빠르게 변화하는 부분을 강조합니다.

5. 와이너 필터 (Wiener Filter)

와이너 필터는 주로 신호나 이미지 복원에 사용됩니다. 복잡한 주파수 영역 처리가 포함되어, 여기에서 간단한 구현을 제공하는 것은 불가능합니다.

결론

이 필터들의 각 구현은 상당히 기초적이며, 실제 응용에서는 더 많은 최적화와 예외 처리가 필요합니다. 또한, 다양한 필터링 기법을 조합하여 사용할 수 있으며, 특정 애플리케이션의 요구에 맞추어 필터의 파라미터를 조정해야 할 수도 있습니다. 각 필터의 특성을 이해하고, 적절한 상황에서 최적의 필터를 선택하는 것이 중요합니다.

9장 - Histogram

픽셀의 강도 분포를 그래프로 표현한 것!

다양한 물체 -> 다양한 필터를 사용해야한다. -> 여기선 AI를 사용하지 못하므로 히스토그램을 통해 구분한다.

 

 

10강 - Histogram Equalization

Luminance : 휘도 - 물체에서 반사된 빛의 세기
Distinguishable : 구별할 수 있는
Contrast : 대비

분포도가 압축되었다. -> low contrast, 명암 대비가 낮다.

Emphasize : 강조하다

누적 히스토그램 -> 마지막엔 전체 픽셀수와 동일해진다.

 

12강 - Downsampling

여긴 엄청 간단하다.

이것도 쇽쇽하면 되구여

파일 형식 바꿔야 되는 것 인지하고 있어야 됩니다.

 

13강 - Up Sampling

이건 금방 구혔했죠

여기부터가 살살...

 

 

 

728x90