Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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
Image 估计图像线梯度(非像素梯度)_Image_Matlab_Opencv_Image Processing_Gradient - Fatal编程技术网

Image 估计图像线梯度(非像素梯度)

Image 估计图像线梯度(非像素梯度),image,matlab,opencv,image-processing,gradient,Image,Matlab,Opencv,Image Processing,Gradient,我有一个问题,我想估计轮廓线的梯度。请注意,我不需要像素梯度,但线的变化率 如果您看到附加的图像,您将看到一个具有绿色轮廓的二值图像。我想根据轮廓上像素的梯度来标记每个像素 我之所以需要梯度是因为我想计算梯度方向从+到-或从-到+变化的点 我想不出一个好的方法来估计图像上的这个点。有人能帮我建议一下如何估计这一点吗 这里有一个小程序,它以一种非常简单的方式计算每个轮廓像素位置的切线(还有其他可能更好的方法!简单的方法有:): 对于轮廓像素c_{i}得到相邻的c_{i-1}和c_{i+1} c_i

我有一个问题,我想估计轮廓线的梯度。请注意,我不需要像素梯度,但线的变化率

如果您看到附加的图像,您将看到一个具有绿色轮廓的二值图像。我想根据轮廓上像素的梯度来标记每个像素

我之所以需要梯度是因为我想计算梯度方向从+到-或从-到+变化的点

我想不出一个好的方法来估计图像上的这个点。有人能帮我建议一下如何估计这一点吗


这里有一个小程序,它以一种非常简单的方式计算每个轮廓像素位置的切线(还有其他可能更好的方法!简单的方法有:):

  • 对于轮廓像素c_{i}得到相邻的c_{i-1}和c_{i+1}
  • c_i的切向为(c_{i-1}-c_{i+1}
  • 所以这都是关于轮廓像素的,但是如果你计算与整个图像像素梯度正交的话,也许你可以做一些类似的事情……不确定;)

    代码如下:

    int main()
    {
        cv::Mat input = cv::imread("../inputData/ContourTangentBin.png");
    
        cv::Mat gray;
        cv::cvtColor(input,gray,CV_BGR2GRAY);
    
        // binarize
        cv::Mat binary = gray > 100;
    
        // find contours
        std::vector<std::vector<cv::Point> > contours;
        std::vector<cv::Vec4i> hierarchy;
        findContours( binary.clone(), contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE );    // CV_CHAIN_APPROX_NONE to get each single pixel of the contour!!
    
    
        for( int i = 0; i< contours.size(); i++ )
        {
            std::vector<cv::Point> & cCont = contours[i];
            std::vector<cv::Point2f> tangents;
    
            if(cCont.size() < 3) continue;
    
            // 1. compute tangent for first point
            cv::Point2f cPoint = cCont.front();
            cv::Point2f tangent = cCont.back() - cCont.at(1);   // central tangent => you could use another method if you like to
            tangents.push_back(tangent);
    
            // display first tangent
            cv::Mat tmpOut = input.clone();
            cv::line(tmpOut, cPoint + 10*tangent, cPoint-10*tangent, cv::Scalar(0,0,255),1);
            cv::imshow("tangent",tmpOut);
            cv::waitKey(0);
    
            for(unsigned int j=1; j<cCont.size(); ++j)
            {
                cPoint = cCont[j];
                tangent = cCont[j-1] - cCont[(j+1)%cCont.size()];   // central tangent => you could use another method if you like to
                tangents.push_back(tangent);
    
                //display current tangent:
                tmpOut = input.clone();
                cv::line(tmpOut, cPoint + 10*tangent, cPoint-10*tangent, cv::Scalar(0,0,255),1);
                cv::imshow("tangent",tmpOut);
                cv::waitKey(0);
                //if(cv::waitKey(0) == 's') cv::imwrite("../outputData/ContourTangentTangent.png", tmpOut);
            }
    
            // now there are all the tangent directions in "tangents", do whatever you like with them
        }
    
        for( int i = 0; i< contours.size(); i++ )
        {
            drawContours( input, contours, i, cv::Scalar(0,255,0), 1, 8, hierarchy, 0 );
        }
    
        cv::imshow("input", input);
        cv::imshow("binary", binary);
        cv::waitKey(0);
        return 0;
    }
    
    intmain()
    {
    cv::Mat input=cv::imread(../inputData/ContourTangentBin.png”);
    cv::席灰色;
    cv::CVT颜色(输入,灰色,cv_bgr2灰色);
    //二值化
    cv::Mat二进制=灰色>100;
    //寻找轮廓
    矢量轮廓;
    向量层次;
    findContours(binary.clone()、轮廓、层次、CV_RETR_树、CV_CHAIN_approw_NONE);//CV_CHAIN_approw_NONE以获取轮廓的每个像素!!
    对于(int i=0;i如果愿意,可以使用其他方法
    切线。向后推(切线);
    //显示第一切线
    cv::Mat tmpOut=input.clone();
    cv::直线(tmpOut,cPoint+10*切线,cPoint-10*切线,cv::标量(0,0255),1);
    cv::imshow(“切线”,tmpOut);
    cv::waitKey(0);
    对于(unsigned int j=1;j),如果愿意,可以使用其他方法
    切线。向后推(切线);
    //显示当前切线:
    tmpOut=input.clone();
    cv::直线(tmpOut,cPoint+10*切线,cPoint-10*切线,cv::标量(0,0255),1);
    cv::imshow(“切线”,tmpOut);
    cv::waitKey(0);
    //如果(cv::waitKey(0)==“s”)cv::imwrite(../outputData/ContourTangentTangent.png),tmpOut;
    }
    //现在“切线”中有所有的切线方向,可以随意使用它们
    }
    对于(int i=0;i
    我用了这个图像:

    得到的结果如下:


    在结果中,你会得到一个向量,其中包含该轮廓每个像素的2D切线信息(线方向)。

    你能说出“线的变化率”是什么意思吗?!?什么样的“变化”?@Mika:我相信OP想要计算与形状的切线。使用findContours并为每个轮廓像素计算当前轮廓周围轮廓像素的差值pixel@Micka是的,乔纳斯是正确的,我需要找到每个像素的切线。你能详细说明你在上面指定的方法中的意思吗?谢谢t切线方向与像素梯度方向正好正交??谢谢,我正在看代码和解释,我明白了它的意思,但没有意识到它有多简单;)。非常感谢。