Jump to content

Сбалансированная пороговая обработка гистограммы

При обработке изображений ( используется метод пороговой обработки сбалансированной гистограммы BHT), [1] Это очень простой метод, используемый для автоматического определения порога изображения . Как метод Оцу [2] и метод итеративного выбора порога , [3] это метод определения порога на основе гистограммы . Этот подход предполагает, что изображение разделено на два основных класса: фон и передний план . Метод BHT пытается найти оптимальный пороговый уровень, который делит гистограмму на два класса.

Оригинальное изображение.
Пороговое изображение.
Эволюция метода.

Этот метод взвешивает гистограмму, проверяет, какая из двух сторон тяжелее, и удаляет вес с более тяжелой стороны, пока она не станет более легкой. Он повторяет ту же операцию до тех пор, пока края весов не соприкоснутся.

Учитывая свою простоту, этот метод является хорошим выбором в качестве первого подхода при рассмотрении темы автоматического определения порога изображения .

Алгоритм

[ редактировать ]

Следующий листинг в нотации C представляет собой упрощенную версию метода порогового значения сбалансированной гистограммы :

int BHThreshold(int[] histogram) {
    i_m = (int)((i_s + i_e) / 2.0f); // center of the weighing scale I_m
    w_l = get_weight(i_s, i_m + 1, histogram); // weight on the left W_l
    w_r = get_weight(i_m + 1, i_e + 1, histogram); // weight on the right W_r
    while (i_s <= i_e) {
        if (w_r > w_l) { // right side is heavier
            w_r -= histogram[i_e--];
            if (((i_s + i_e) / 2) < i_m) {
                w_r += histogram[i_m];
                w_l -= histogram[i_m--];
            }
        } else if (w_l >= w_r) { // left side is heavier
            w_l -= histogram[i_s++]; 
            if (((i_s + i_e) / 2) >= i_m) {
                w_l += histogram[i_m + 1];
                w_r -= histogram[i_m + 1];
                i_m++;
            }
        }
    }
    return i_m;
}

Ниже приведена возможная реализация на языке Python :

import numpy as np

def balanced_histogram_thresholding(histogram, minimum_bin_count: int = 5) -> int:
    """
    Determines an optimal threshold by balancing the histogram of an image, 
    focusing on significant histogram bins to segment the image into two parts.

    This function iterates through the histogram to find a threshold that divides 
    the histogram into two parts with a balanced sum of bin counts on each side. 
    It effectively segments the image into foreground and background based on this threshold. 
    The algorithm ignores bins with counts below a specified minimum, ensuring that 
    noise or very low-frequency bins do not affect the thresholding process.

    Args:
        histogram (np.ndarray): The histogram of the image as a 1D numpy array, 
                                where each element represents the count of pixels 
                                at a specific intensity level.
        minimum_bin_count (int): Minimum count for a bin to be considered in the 
                                 thresholding process. Bins with counts below this 
                                 value are ignored, reducing the effect of noise.

    Returns:
        int: The calculated threshold value. This value represents the intensity level 
             (i.e. the index of the input histogram) that best separates the significant
             parts of the histogram into two groups, which can be interpreted as foreground
             and background. 
             If the function returns -1, it indicates that the algorithm was unable to find 
             a suitable threshold within the constraints (e.g., all bins are below the 
             minimum_bin_count).

    """
    start_index = 0
    while histogram[start_index] < minimum_bin_count and start_index < len(histogram) - 1:
        start_index += 1
    
    end_index = len(histogram) - 1
    while histogram[end_index] < minimum_bin_count and end_index > 0:
        end_index -= 1

    if start_index >= end_index:
        return -1  # Indicates an error or non-applicability

    threshold = (start_index + end_index) // 2

    while True:
        weight_left = np.sum(histogram[start_index:threshold])
        weight_right = np.sum(histogram[threshold:end_index + 1])

        if weight_left > weight_right:
            end_index = threshold - 1
        else:
            start_index = threshold + 1

        new_threshold = (start_index + end_index) // 2

        if new_threshold == threshold:
            break
        else:
            threshold = new_threshold

    return threshold
  1. ^ А. Аньос и Х. Шахбазкиа. Двухуровневое пороговое значение изображения — быстрый метод. БИОСИГНАЛЫ 2008. Том:2. П:70-76.
  2. ^ Нобуюки Оцу (1979). «Метод выбора порога из гистограмм уровня серого». IEEE Транс. Сис., Ман., Кибер. 9: 62–66.
  3. ^ Ридлер Т.В., Калвард С. (1978) Установление порога изображения с использованием метода итеративного выбора, IEEE Trans. Система, Человек и Кибернетика, SMC-8: 630-632.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: d6215ffd6d085b15117685034d943531__1707399720
URL1:https://arc.ask3.ru/arc/aa/d6/31/d6215ffd6d085b15117685034d943531.html
Заголовок, (Title) документа по адресу, URL1:
Balanced histogram thresholding - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)