ভারসাম্যযুক্ত হিস্টগ্রাম থ্রেসহোল্ডিং

চিত্র প্রক্রিয়াকরণে ভারসাম্যপূর্ণ হিস্টগ্রাম থ্রেসহোল্ডিং পদ্ধতি (বিএইচটি)[১] স্বয়ংক্রিয় চিত্র থ্রেসহোল্ডিংয়ের জন্য ব্যবহৃত একটি খুব সাধারণ পদ্ধতি। ওসুর পদ্ধতি[২] এবং আইট্রেটিভ সিলেকশন থ্রেসহোল্ডিং পদ্ধতির মত[৩] এটিও একটি হিস্টগ্রাম ভিত্তিক থ্রেসহোল্ডিং পদ্ধতি। এই পদ্ধতিতে চিত্রটি দুটি প্রধান শ্রেণিতে বিভক্ত: পটভূমি এবং সম্মুখভাগ করা হয়। বিএইচটি পদ্ধতিটি সর্বোত্তম প্রান্তিক স্তরের সন্ধান করার চেষ্টা করে যা হিস্টগ্রামকে দুটি শ্রেণিতে বিভক্ত করে।

আসল চিত্র।
থ্রেসহোল্ডিং চিত্র
পদ্ধতির বিবর্তন।

এই পদ্ধতিটি হিস্টোগ্রামের ওজন করে, উভয় পক্ষের মধ্যে ভারী কিনা তা পরীক্ষা করে এবং হালকা হওয়া অবধি ভারী দিক থেকে ওজন সরিয়ে দেয়। ওজন স্কেলের কিনারা পূরণ না হওয়া পর্যন্ত এটি একই অপারেশন পুনরাবৃত্তি করে।

স্বয়ংক্রিয় চিত্র থ্রেসহোল্ডিং বিষয় উপস্থাপনের জন্য এই পদ্ধতি একটি সরল উদাহরণ।

অ্যালগরিদমসম্পাদনা

সি নোটেশনে লিখিত নিচের তালিকাটি ভারসাম্য হিস্টোগ্রাম থ্রেসহোল্ডিং পদ্ধতির একটি সরল সংস্করণ:

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;
}

নিম্নলিখিতটি পাইথন ভাষায় একটি সম্ভাব্য বাস্তবায়ন:

def bht(hist, min_count: int = 5) -> int:
    """Balanced histogram thresholding."""
    n_bins = len(hist)  # assumes 1D histogram
    h_s = 0
    while hist[h_s] < min_count:
        h_s += 1  # ignore small counts at start
    h_e = n_bins - 1
    while hist[h_e] < min_count:
        h_e -= 1  # ignore small counts at end
    # use mean intensity of histogram as center; alternatively: (h_s + h_e) / 2)
    h_c = int(round(np.average(np.linspace(0, 2 ** 8 - 1, n_bins), weights=hist)))
    w_l = np.sum(hist[h_s:h_c])  # weight in the left part
    w_r = np.sum(hist[h_c : h_e + 1])  # weight in the right part

    while h_s < h_e:
        if w_l > w_r:  # left part became heavier
            w_l -= hist[h_s]
            h_s += 1
        else:  # right part became heavier
            w_r -= hist[h_e]
            h_e -= 1
        new_c = int(round((h_e + h_s) / 2))  # re-center the weighing scale

        if new_c < h_c:  # move bin to the other side
            w_l -= hist[h_c]
            w_r += hist[h_c]
        elif new_c > h_c:
            w_l += hist[h_c]
            w_r -= hist[h_c]

        h_c = new_c

    return h_c

তথ্যসূত্রসম্পাদনা

  1. A. Anjos and H. Shahbazkia. Bi-Level Image Thresholding - A Fast Method. BIOSIGNALS 2008. Vol:2. P:70-76.
  2. Nobuyuki Otsu (1979). "A threshold selection method from gray-level histograms". IEEE Trans. Sys., Man., Cyber. 9: 62–66.
  3. Ridler TW, Calvard S. (1978) Picture thresholding using an iterative selection method, IEEE Trans. System, Man and Cybernetics, SMC-8: 630-632.

বহিসংযোগসম্পাদনা