将标准化/一致性引入std dev比较的技术?

时间:2018-03-24 08:51:13

标签: opencv computer-vision

我正在为单通道图像实现一种非常简单的分割算法。该算法的工作原理如下:

对于单通道图像:

  1. 计算标准偏差,即测量图像中亮度变化的程度。
  2. 如果stddev> 15(又名门槛):

    • 将图像分为4个单元格/图像
    • 对于每个细胞:
      • 重复步骤1和步骤2(去递归)

    其他:

    • 在源图像上绘制一个矩形,表示该段位于这些边界内。
  3. 出现我的问题是因为我的阈值是不变的,当我递归时15不再是该图像是否是同质的一个很好的标志。 如何在同质性检查中引入一致性/规范化?

    我应该将每张图片调整为相同尺寸(100x100)吗?我的门槛应该是公式吗?说15 / img.rows * img.cols15 / MAX_HISTOGRAM_PEAK

    修改代码:

    void split_mat(const Mat& src, Mat& split1, Mat& split2, Mat& split3, Mat& split4) {
    
        split1 = Mat(src, Rect(Point(0, 0), Point(src.cols / 2, src.rows / 2)));
        split1 = Mat(src, Rect(Point(src.cols/2, 0), Point(src.cols, src.rows / 2)));
        split3 = Mat(src, Rect(Point(0, src.rows/2), Point(src.cols / 2, src.rows)));
        split4 = Mat(src, Rect(Point(src.cols/2, src.rows/2), Point(src.cols, src.rows)));
    }
    
    void segment_by_homogeny(const Mat& src, double threshold) {
    
        Scalar mean, stddev;
        meanStdDev(src, mean, stddev);
    
        double dev = stddev[0]; // / (src.rows * src.cols) * 100.0;
    
        if (dev >= threshold) {
            Mat s1, s2, s3, s4;
            split_mat(src, s1, s2, s3, s4);
    
            // Go recursive and segment each sub-segment where necessary
            segment_by_homogeny(s1, threshold);
            segment_by_homogeny(s2, threshold);
            segment_by_homogeny(s3, threshold);
            segment_by_homogeny(s4, threshold);
        }
        else {
            // Store 'segment' in global vector 'images' 
            // and write std dev on it
            char d[255];
            sprintf_s(d, "Std Dev: %f", stddev[0]);
            putText(src, d, cvPoint(30, 60),
                FONT_HERSHEY_COMPLEX_SMALL, 0.7, cvScalar(200, 200, 250), 1, CV_AA);
            images.push_back(src);
        }
    }
    
    
    // current usage for the example image results in inifinite recursion. 
    // The green and red segment never has a std dev < 25
    segment_by_homogeny(img, 25); 
    

    enter image description here

    我期待我的算法生成以下5个段:

    enter image description here

1 个答案:

答案 0 :(得分:0)

您可以简化算法。因为您想将给定区域划分为4个子区域,您可以先将其划分为4个子区域,然后计算每个子区域的平均亮度值,并在这些邻域值之间的差值上设置阈值。