边缘检测ppm对象

时间:2018-02-28 07:04:12

标签: c++

我有点处于绝望模式,试图找出遗漏的东西。我有一个学校的任务,要求用于边缘检测。我是c ++和编程通用的新手。我有垂直检测的问题,并且代码看起来像这样。

void verticalDetection(std::string in_file, std::string out_file) {
    PPM verticals;
    std::ifstream input_file(in_file);
    std::ofstream output_file(out_file);
    input_file >> verticals;

    int i, j, k, new_c1, new_c2;
    int check = verticals.getMaxColorValue() / 10;
    for (i = 0; i < verticals.getHeight() ; i++) {
        for (j = 1; j < verticals.getWidth() ; j++) {
            for (k = 0; k < 3 ; k++) {

                if (k==0) {
                    double r1 = verticals.getChannel(i, j, k);
                    double g1 = verticals.getChannel(i, j, k+1);
                    double b1 = verticals.getChannel(i, j, k+2);

                    double r2 = verticals.getChannel(i, j-1, k);
                    double g2 = verticals.getChannel(i, j-1, k+1);
                    double b2 = verticals.getChannel(i, j-1, k+2);
                    double c1 = 0.2126*r1 + 0.7152*g1 + 0.0722*b1;
                    double c2 = 0.2126*r2 + 0.7152*g2 + 0.0722*b2;
                    new_c1 = (int)c1;
                    new_c2 = (int)c2;

                    if ((new_c1 - new_c2 > 0 && new_c1 - new_c2 <= check) || (new_c2 - new_c1 > 0 && new_c2 - new_c1 <= check)) {
                    verticals.setChannel(i, j, k, 255);
                    verticals.setChannel(i, j, k+1, 255);
                    verticals.setChannel(i, j, k+2, 255);
                    } else {
                    verticals.setChannel(i, j, k, 0);
                    verticals.setChannel(i, j, k+1, 0);
                    verticals.setChannel(i, j, k+2, 0);
                    }
                } 
            }
        }
    }

    output_file << verticals;
}

虽然输出有一些相似之处,但它看起来与提供的示例完全不同。作业要求这样做。

  

通过将每个像素的亮度与其左侧的像素进行比较来查找垂直边缘。如果像素的亮度相差最大颜色值的至少10%,则在该像素处检测到边缘。必须将像素设置为检测到边缘的白色和未检测到边缘的黑色。

     

出于此分配的目的,亮度定义为像素的线性色度值。

我做错了什么?我觉得我的思想存在缺陷。我将提供输出的图像与预期的正确输出。

my output

预期: expected output

0 个答案:

没有答案