Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 大津阈值法_C_Image Processing - Fatal编程技术网

C 大津阈值法

C 大津阈值法,c,image-processing,C,Image Processing,我试图用大津的方法计算一个阈值。示例图像为8位灰度bmp文件 该图像的直方图由以下步骤生成: /* INITIALIZE ARRAYS */ for(int i = 0; i < 255; i++) occurrence[i] = 0; for(int i = 0; i < 255; i++) histogram[i] = 0; /* START AT BEGINNING OF RASTER DATA */ fseek(input_img, (54 + 4 * color_numb

我试图用大津的方法计算一个阈值。示例图像为8位灰度bmp文件

该图像的直方图由以下步骤生成:

/* INITIALIZE ARRAYS */
for(int i = 0; i < 255; i++) occurrence[i] = 0;
for(int i = 0; i < 255; i++) histogram[i] = 0;

/* START AT BEGINNING OF RASTER DATA */
fseek(input_img, (54 + 4 * color_number), SEEK_SET);

/* READ RASTER DATA */
for(int r = 0; r <= original_img.rows - 1; r++) {
    for(int c = 0; c <= original_img.cols -1; c++) {
        fread(p_char, sizeof(char), 1, input_img);
        pixel_value = *p_char;
        /* COUNT OCCURRENCES OF PIXEL VALUE */
        occurrence[pixel_value] = occurrence[pixel_value] + 1;
        total_pixels++;
    }
}

for(int i = 0; i <= 255; i++) {
    /* TAKES NUMBER OF OCCURRENCES OF A PARTICULAR PIXEL 
    * AND DIVIDES BY THE TOTAL NUMBER OF PIXELS YIELDING 
    * A RATIO */
    histogram[i] = (float) occurrence[i] / (float) total_pixels;
}
函数
otsu\u方法

int otsu_method(float *histogram, long int total_pixels) {
    double omega[256], myu[256];
    double max_sigma, sigma[256];
    int threshold;

    omega[0] = histogram[0];
    myu[0] = 0.0;

    for(int i = 1; i < 256; i++) {
        omega[i] = omega[i - 1] + histogram[i];
        myu[i] = myu[i - 1] + i * histogram[i];
    }

    threshold = 0;
    max_sigma = 0.0;

    for(int i = 0; i < 255; i++) {
        if(omega[i] != 0.0 && omega[i] != 1.0)
            sigma[i] = pow(myu[255] * omega[i], 2) / (omega[i] * (1.0 - omega[i]));
        else
            sigma[i] = 0.0;
        if(sigma[i] > max_sigma) {
            max_sigma = sigma[i];
            threshold = i;
        }
    }

    printf("Threshold value: %d\n", threshold);

return threshold;
}
我认为244不是一个正确计算的阈值,因为当函数threshold_image对图像进行二值化时,所有像素都转换为黑色

如果我跳过了大津法,并从用户输入函数中获取阈值,图像就会正常工作

函数
otsu_方法
是复制粘贴的代码,因此我对变量或条件不是非常清楚。
我正在学习图像处理,并试图找出一些基础知识。关于Otsu算法的任何信息以及关于我的代码的任何反馈都有帮助。

我找到了导致问题的原因,并更改了函数Otsu\u方法:

int otsu_method(float *histogram, long int total_pixels) {
    double probability[256], mean[256];
    double max_between, between[256];
    int threshold;

    /*
    probability = class probability
    mean = class mean
    between = between class variance
    */

    for(int i = 0; i < 256; i++) {
        probability[i] = 0.0;
        mean[i] = 0.0;
        between[i] = 0.0;
    }

    probability[0] = histogram[0];

    for(int i = 1; i < 256; i++) {
        probability[i] = probability[i - 1] + histogram[i];
        mean[i] = mean[i - 1] + i * histogram[i];
    }

    threshold = 0;
    max_between = 0.0;

    for(int i = 0; i < 255; i++) {
        if(probability[i] != 0.0 && probability[i] != 1.0)
            between[i] = pow(mean[255] * probability[i] - mean[i], 2) / (probability[i] * (1.0 - probability[i]));
    else
        between[i] = 0.0;
        if(between[i] > max_between) {
            max_between = between[i];
            threshold = i;
        }
    }

    return threshold;
}
程序输出:

Reading file 512gr.bmp
Width: 512
Height: 512
File size: 263222
# Colors: 256
Vector size: 262144
Total number of pixels: 262144
Threshold value: 244
Reading file 512gr.bmp
Width: 512
Height: 512
File size: 263222
# Colors: 256
Vector size: 262144
Total number of pixels: 262144

Threshold value: 117
Probability: 0.416683
Mean: 31.9631
Between varaince: 1601.01
int otsu_method(float *histogram, long int total_pixels) {
    double probability[256], mean[256];
    double max_between, between[256];
    int threshold;

    /*
    probability = class probability
    mean = class mean
    between = between class variance
    */

    for(int i = 0; i < 256; i++) {
        probability[i] = 0.0;
        mean[i] = 0.0;
        between[i] = 0.0;
    }

    probability[0] = histogram[0];

    for(int i = 1; i < 256; i++) {
        probability[i] = probability[i - 1] + histogram[i];
        mean[i] = mean[i - 1] + i * histogram[i];
    }

    threshold = 0;
    max_between = 0.0;

    for(int i = 0; i < 255; i++) {
        if(probability[i] != 0.0 && probability[i] != 1.0)
            between[i] = pow(mean[255] * probability[i] - mean[i], 2) / (probability[i] * (1.0 - probability[i]));
    else
        between[i] = 0.0;
        if(between[i] > max_between) {
            max_between = between[i];
            threshold = i;
        }
    }

    return threshold;
}
between[i] = pow(mean[255] * probability[i] - mean[i], 2) / (probability[i] * (1.0 - probability[i]));
Reading file 512gr.bmp
Width: 512
Height: 512
File size: 263222
# Colors: 256
Vector size: 262144
Total number of pixels: 262144

Threshold value: 117
Probability: 0.416683
Mean: 31.9631
Between varaince: 1601.01