C#, 이미지 이진화(13) - 전역 임계값의 바이모달 임계값 알고리즘 및 소스 프로그램

1. 이미지 이진화 개요

이미지 이진화는 컬러 이미지를 흑백 이미지로 변환하는 것입니다. 대부분의 컴퓨터 비전 애플리케이션은 사진을 이진 표현으로 변환합니다. 원시 이미지가 많을수록 컴퓨터가 기본 기능을 더 쉽게 해석할 수 있습니다.

이진화 프로세스

컴퓨터 메모리에서 모든 파일은 일반적으로 0에서 255까지 최대 256개의 서로 다른 그레이 스케일 값을 가진 그레이 스케일로 저장됩니다. 각 그레이스케일 값은 그레이스케일 팔레트의 다른 색상을 생성합니다. 문서 이미지에서 일부 정보가 필요한 경우 여러 번 수행해야 합니다. 이미지의 일부를 추출하는 데 필요한 시간을 줄이려면 이진 이미지가 더 유용합니다.

이진화는 회색조 이미지(다중톤 이미지)를 흑백 이미지(이중톤 이미지)로 변환하는 방법입니다. 이진화를 수행하려면 먼저 그레이 스케일의 임계값을 찾고 픽셀에 특정 그레이 스케일 값이 있는지 확인합니다.

그레이스케일 값이 임계값보다 크면 픽셀을 흰색으로 변환합니다. 마찬가지로 픽셀의 회색 값이 임계값보다 작은 경우 픽셀은 검은색으로 변환됩니다.

두 가지 유형의 이진화 방법이 아래에 설명되어 있습니다.

i. 글로벌 또는 개별 임계값에 기반한 이진화

둘. 지역 기반 이진화

1. 전역 또는 단일 임계값 기반 이진화: 일반적으로 전역 임계값은 전체 이미지에 대해 발견되며 단일 임계값은 이미지를 이진화하는 데 사용됩니다. 그러나 이 단일 임계값 방법에서는 일반적으로 일부 중요한 정보나 콘텐츠가 있을 수 있는 이미지의 로컬 분산이 손실되거나 억제됩니다.

2. 영역 기반 이진화: 영역에 따라 임계값이 결정되는 또 다른 이진화 방법도 고안되었습니다. 실제로 이미지는 여러 영역 또는 창으로 나뉩니다. Saha에 따르면 각 영역 또는 창은 자체 로컬 임계값을 계산하거나 결정한 다음 로컬 임계값의 도움을 받아 해당 영역을 이중톤 영역으로 변환합니다.

실제 시나리오에서는 비효율적인 이미지 획득 프로세스, 원본 소스의 품질 저하 또는 원본 소스의 불균일한 조명으로 인해 발생할 수 있는 저하로 인해 이진화 프로세스가 실패합니다.

이미지 이진화는 컬러 이미지를 흑백 이미지로 바꾸는 것입니다. 대부분의 컴퓨터 비전 애플리케이션은 그림을 이진 표현으로 변환합니다. 처리되지 않은 이미지가 많을수록 컴퓨터가 기본 특성을 더 쉽게 해석할 수 있습니다.

이진화 프로세스
일반적으로 컴퓨터 메모리에서 모든 문서는 0에서 255까지 최대 256개의 다른 그레이 값을 갖는 그레이 레벨의 형태로 저장됩니다. 각 그레이 값은 그레이 스케일 팔레트의 다른 색상을 생성합니다. 문서 이미지에서 일부 정보가 필요한 경우 조치 횟수를 처리하는 데 필요합니다. 이미지의 일부를 추출하는 데 필요한 시간을 줄이려면 이진 이미지가 더 유용합니다.

이진화는 모든 그레이 스케일 이미지(다중톤 이미지)를 흑백 이미지(투톤 이미지)로 변환하는 방법입니다. 이진화 과정을 수행하려면 먼저 그레이 스케일의 임계값을 찾고 픽셀이 특정 그레이 값을 가지는지 여부를 확인합니다.

픽셀의 회색 값이 임계값보다 크면 해당 픽셀이 흰색으로 변환됩니다. 마찬가지로 픽셀의 회색 값이 임계값보다 작은 경우 해당 픽셀은 검정색으로 변환됩니다.

두 가지 유형의 이진화 방법이 아래에 설명되어 있습니다.

나. 전역 또는 단일 임계값에 기반한 이진화
ii. 지역 기반 이진화

1. 전역 또는 단일 임계값 기반 이진화: 일반적으로 전체 이미지에 대한 전역 임계값을 찾고 단일 임계값을 사용하여 이미지를 이진화합니다. 그러나 이 단일 임계값 방법에서는 일반적으로 일부 중요한 정보나 콘텐츠가 있을 수 있는 이미지의 로컬 분산이 손실되거나 억제됩니다.

2. 지역 기반 이진화: 또 다른 방법은 지역에 따라 임계값이 결정되는 이진화를 위해 설계되었습니다. 실제로 이미지는 여러 영역 또는 창으로 나뉩니다. 각 영역 또는 창은 자체 로컬 임계값을 계산하거나 결정한 다음 Saha에 따라 로컬 임계값의 도움을 받아 해당 영역을 2톤 영역으로 변환합니다.

실제 시나리오에서는 이진화 프로세스가 실패합니다. 이미지의 덜 효율적인 획득 프로세스, 원본 소스의 품질 저하 또는 원본 소스에 대한 균일하지 않은 조명으로 인해 성능 저하가 발생할 수 있기 때문입니다.
 

2. 바이모달 평균에 기반한 임계값 알고리즘 및 소스 프로그램

  이진 알고리즘에 대한 개요는 다음을 참조하십시오.

C#, 이미지 이진화(01) - 이진화 알고리즘 검토 및 23개 알고리즘 카탈로그 https://blog.csdn.net/beijinghorn/article/details/128425225?spm=1001.2014.3001.5502

지원 기능에 대해서는 다음을 참조하십시오.

C#, 이미지 이진화(02) - 이미지 이진화를 위한 일부 기본 이미지 처리 함수의 C# 소스 코드 https://blog.csdn.net/beijinghorn/article/details/128425984?spm=1001.2014 . 3001.5502

using System;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Collections;
using System.Collections.Generic;
using System.Drawing.Imaging;
 
namespace Legalsoft.Truffer.ImageTools
{
    public static partial class BinarizationHelper
    {
        #region 灰度图像二值化 全局算法 基于双峰平均值的阈值

        /// <summary>
        /// 基于双峰平均值的阈值
        /// 该算法和基于谷底最小值的阈值方法类似,
        /// 只是最后一步不是取得双峰之间的谷底值,
        /// 而是取双峰的平均值作为阈值。
        /// </summary>
        /// <param name="histogram"></param>
        /// <returns></returns>
        public static int Intermodes_Threshold(int[] histogram)
        {
            double[] HistGramC = Histogram_To_Float(histogram);
            double[] HistGramCC = Histogram_To_Float(histogram);

            int Iter = 0;
            while (Is_Dimodal_Histogram(HistGramCC) == false)
            {
                HistGramCC[0] = (HistGramC[0] + HistGramC[0] + HistGramC[1]) / 3;
                for (int i = 1; i < 255; i++)
                {
                    HistGramCC[i] = (HistGramC[i - 1] + HistGramC[i] + HistGramC[i + 1]) / 3;
                }
                HistGramCC[255] = (HistGramC[254] + HistGramC[255] + HistGramC[255]) / 3;
                System.Buffer.BlockCopy(HistGramCC, 0, HistGramC, 0, 256 * sizeof(double));
                Iter++;
                if (Iter >= 10000)
                {
                    return -1;
                }
            }

            int[] Peak = new int[2];
            for (int i = 1, Index = 0; i < 255; i++)
            {
                if (HistGramCC[i - 1] < HistGramCC[i] && HistGramCC[i + 1] < HistGramCC[i])
                {
                    Peak[Index++] = i - 1;
                }
            }
            return ((Peak[0] + Peak[1]) / 2);
        }

        public static void Intermodes_Algorithm(byte[,] data)
        {
            int[] histogram = Gray_Histogram(data);
            int threshold = Intermodes_Threshold(histogram);
            Threshold_Algorithm(data, threshold);
        }

        #endregion    
    }
}
 

3. 바이모달 평균에 기반한 임계값 알고리즘의 계산 효과

Supongo que te gusta

Origin blog.csdn.net/beijinghorn/article/details/128521963
Recomendado
Clasificación