C#에서 영상의 휘도 값을 취득하거나 설정할 때, GetPixel, SetPixel 방식을 사용하면 속도가 늦어지기 때문에 LockBits ~ UnlockBits에 버튼을 노출시켜 휘도를 취득하거나 설정하는 것이 일반적입니다. 이번 시간에는 여러가지 처리 방법을 이용했을 때의 처리 시간을 비교해 보았습니다.

Testing Environment
OS Windows10 64bit ver.1809
CPU Intel Core i7-7700K 4.2GHz
Memory 32GB
.NET Framework 4.5.2
플랫폼 Any CPU (32Bit 우선)
평가영상 JPEG 6,000 x 4,000px 24bit Color

테스트는 컬러영상의 휘도 값을 R,G,B로 각각 취득하고 명암 값을 반전하여 휘도 값을 다시 대입하는 프로그램을 사용하였습니다.

  1. 처리결과는 아래와 같이 밝음→어두움→밝음→어두움을 반복하도록 하였습니다.
  2. 처리 시간 : 5번 반복 처리 시의 평균 시간을 측정하였습니다.

1. GetPixel, SetPixel을 사용한 방법

Copy to Clipboard

2. LockBits~UnlockBits에서 포인터(Scan0)을 취득하고 데이터를 복사하여 처리한 후,
결과를 기준으로 재복사 하는 방법

Copy to Clipboard

3. Marshal클래스의 ReadByte, WriteByte 방법으로 포인터(Scan0)에 직접 값을 읽고 쓰는 방법

Copy to Clipboard

4. Unsafe를 사용한 포인터(Scan0)을 직접 읽고 쓰는 방법

Copy to Clipboard

5. 포인터로 읽고 쓰며 Parallel.For을 사용하여 처리를 병렬화 하는 방법

Copy to Clipboard

6. 처리를 불러오는 프로그램

Copy to Clipboard

결론

처리방법에 따른 처리시간

처리방법에 따른 처리시간은 아래와 같이 버전과 Bit에 따라 상이했습니다.
32Bit 동작 시, .NET Framework의 4.5.2와 4.7.2에서의 차이는 크게 없었지만, 같은 .NET Framework의 버전에서 32bit와 64Bit 동작을 비교해보면, 64Bit에서 조금 빠른 결과를 얻을 수 있었습니다.

  1. .NET Framework 4.5.2 – 32Bit 기준

    방법 처리시간 (ms)
    GetPixel, SetPixel 27,439
    LockBits, UnlockBits로 배열을 고려한 처리 101
    Marshal 클래스의 ReadByte, WriteByte 273.6
    Unsafe 포인터로 처리 25.4
    Unsafe 포인터로 병렬처리 11.4
  2. .NET Framework 4.7.2 – 32Bit 기준

    방법 처리시간 (ms)
    GetPixel, SetPixel 27,293.4
    LockBits, UnlockBits로 배열을 고려한 처리 101.8
    Marshal 클래스의 ReadByte, WriteByte 290.8
    Unsafe 포인터로 처리 24.4
    Unsafe 포인터로 병렬처리 9.8
  3. .NET Framework 4.7.2 – 64bit 기준
    방법 처리시간 (ms)
    GetPixel, SetPixel 21,281.2
    LockBits, UnlockBits로 배열을 고려한 처리 85.4
    Marshal 클래스의 ReadByte, WriteByte 213.6
    Unsafe 포인터로 처리 27.2
    Unsafe 포인터로 병렬처리 9.2

[참고 및 주의사항]

  • 본 블로그의 내용은 본사 AVALDATA의 소프트웨어 엔지니어인 Akira Yaskawa씨가 운영하는 블로그(Imaging Solution.net)에서 발췌한 것으로, 추가 정보가 필요할 경우 Yaskawa 씨의 블로그를 참고하시기 바랍니다.
  • 본 내용을 공유하거나 참고하는 것에는 제약을 두지 않고 있지만, 무단 복제 또는 수정, 재생산하여 상업적으로 이용하는 행위는 삼가하시기 바랍니다.
  • 위 자료의 사용에 제약을 두지 않으나, 사용에 따른 버그 발생 등의 책임은 사용자에게 있으니 주의 하시기 바랍니다.