ماکزیمم آنتروپی - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

ماکزیمم آنتروپی

0 امتیاز
سلام دوستان

روش ماکزیمم آنتروپی چطور کار می کنه؟

آیا منظور از ماکزیمم آنتروپی همون آنتروپی کاپور هست؟

آیا میاد هیستوگرام تصویر به سطوح مختلف تقسیم می کنه و آنتروپی هر قسمت بدست میاره یا روش دیگه ای داره؟

ممنون میشم کمک کنید
سوال شده اردیبهشت 30, 1398  بوسیله ی pilapila (امتیاز 232)   14 43 56
ویرایش شده اردیبهشت 30, 1398 بوسیله ی pilapila

1 پاسخ

0 امتیاز

الگوریتمش به صورت زیر 

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

uchar maxentropie(const Mat1b& src, Mat1b& dst)
{
    // Histogram
    Mat1d hist(1, 256, 0.0);
    for (int r=0; r<src.rows; ++r)
        for (int c=0; c<src.cols; ++c)
            hist(src(r,c))++;

    // Normalize
    hist /= double(src.rows * src.cols);

    // Cumulative histogram
    Mat1d cumhist(1, 256, 0.0);
    float sum = 0;
    for (int i = 0; i < 256; ++i)
    {
        sum += hist(i);
        cumhist(i) = sum;
    }

    Mat1d hl(1, 256, 0.0);
    Mat1d hh(1, 256, 0.0);

    for (int t = 0; t < 256; ++t)
    {
        // low range entropy
        double cl = cumhist(t);
        if (cl > 0)
        {
            for (int i = 0; i <= t; ++i)
            {
                if (hist(i) > 0)
                {
                    hl(t) = hl(t) - (hist(i) / cl) * log(hist(i) / cl);
                }
            }
        }

        // high range entropy
        double ch = 1.0 - cl;  // constraint cl + ch = 1
        if (ch > 0)
        {
            for (int i = t+1; i < 256; ++i)
            {
                if (hist(i) > 0)
                {
                    hh(t) = hh(t) - (hist(i) / ch) * log(hist(i) / ch);
                }
            }
        }
    }

    // choose best threshold

    Mat1d entropie(1, 256, 0.0);
    double h_max = hl(0) + hh(0);
    uchar threshold = 0;
    entropie(0) = h_max;

    for (int t = 1; t < 256; ++t)
    {
        entropie(t) = hl(t) + hh(t);
        if (entropie(t) > h_max)
        {
            h_max = entropie(t);
            threshold = uchar(t);
        }
    }

    // Create output image
    dst = src > threshold;

    return threshold;
}

int main()
{
    Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE);

    Mat1b res;
    uchar th = maxentropie(img, res);

    imshow("Original", img);
    imshow("Result", res);
    waitKey();

    return 0;
}

 

پاسخ داده شده اردیبهشت 30, 1398 بوسیله ی نیما تاش (امتیاز 121)   4 18 23
...