分水岭算法

#include<string>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
    Mat g_midimage, himg, simg, vimg, tmpimage, binary_image;
    Mat g_srcimage = imread("D:\\testImg\\t12.png");
    cvtColor(g_srcimage, g_midimage, COLOR_BGR2HSV);
    vector<Mat> hsv;
    split(g_midimage, hsv);
    himg = hsv[0];
    simg = hsv[1];
    vimg = hsv[2];

    for (int i = 0;i < himg.rows;i++)
    {
        for (int j = 0;j < himg.cols;j++)
        {
            uchar hvalue = himg.at<uchar>(i, j);
            if ((hvalue > 0 && hvalue < 30) || (hvalue > 170 && hvalue < 180))
                himg.at<uchar>(i, j) = 255;
            else
                himg.at<uchar>(i, j) = 0;
        }
    }
    for (int i = 0;i < simg.rows;i++)
    {
        for (int j = 0;j < simg.cols;j++)
        {
            uchar svalue = simg.at<uchar>(i, j);
            if ((svalue > 0 && svalue < 20) || (svalue > 50 && svalue < 100))
                simg.at<uchar>(i, j) = 255;
            else
                simg.at<uchar>(i, j) = 0;
        }
    }
    for (int i = 0;i < vimg.rows;i++)
    {
        for (int j = 0;j < vimg.cols;j++)
        {
            uchar vvalue = vimg.at<uchar>(i, j);
            if (vvalue > 170 && vvalue < 220)
                vimg.at<uchar>(i, j) = 255;
            else
                vimg.at<uchar>(i, j) = 0;

        }
    }
    bitwise_and(himg, simg, tmpimage);
    bitwise_and(tmpimage, vimg, binary_image);
    //imshow("binary", binary_image);

    Mat fg;
    erode(binary_image, fg, Mat(), Point(-1, -1), 6);
    //imshow("foreground", fg);


    Mat bg;
    dilate(binary_image, bg, Mat(), Point(-1, -1), 6);
    threshold(bg, bg, 1, 128, THRESH_BINARY_INV);
    //imshow("background", bg);
    Mat markers(binary_image.size(), CV_8U, Scalar(0));
    markers = fg + bg;
    markers.convertTo(markers, CV_32S);
    watershed(g_srcimage, markers);

    Mat tmp;
    markers.convertTo(tmp, CV_8U);
    double pixekcount = 0., blackcount = 0.;
    for (int i = 0;i < tmp.rows;i++)
    {
        for (int j = 0;j < tmp.cols;j++)
        {
            pixekcount++;
            uchar gvalue = tmp.at<uchar>(i, j);
            if (gvalue == 255)
                blackcount++;
        }

    }
    double scale_img;
    scale_img = blackcount / pixekcount;
    if (scale_img > 0.04)
    {
        putText(g_srcimage, "have dust!", Point(10, 20), 3, 0.5, Scalar(0, 0, 255));
    }
    else
        putText(g_srcimage, "no dust!", Point(10, 20), 3, 0.5, Scalar(255, 0, 0));
    imshow("ori", g_srcimage);
    waitKey(0);
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容