Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.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++ 基于opencv的图像边缘平滑_C++_Ios_Iphone_Objective C_Opencv - Fatal编程技术网

C++ 基于opencv的图像边缘平滑

C++ 基于opencv的图像边缘平滑,c++,ios,iphone,objective-c,opencv,C++,Ios,Iphone,Objective C,Opencv,我正在尝试使用opencv框架平滑输出图像边缘,我正在尝试以下步骤。从这里开始采取的步骤 我需要帮助,不管我是否走对了路,或者我错过了什么 谢谢你的建议和帮助 更新: 我得到了一张像下面这样的图像,它来自于grabcut算法,现在我想对图像应用边缘平滑,因为你可以看到图像是不平滑的。 你想买这样的东西吗 如果是,则代码如下: #include <iostream> #include <vector> #include <string> #include &l

我正在尝试使用opencv框架平滑输出图像边缘,我正在尝试以下步骤。从这里开始采取的步骤

我需要帮助,不管我是否走对了路,或者我错过了什么

谢谢你的建议和帮助

更新:

我得到了一张像下面这样的图像,它来自于grabcut算法,现在我想对图像应用边缘平滑,因为你可以看到图像是不平滑的。

你想买这样的东西吗

如果是,则代码如下:

#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char **argv)
{
    cv::namedWindow("result");
    Mat img=imread("TestImg.png");
    Mat whole_image=imread("D:\\ImagesForTest\\lena.jpg");
    whole_image.convertTo(whole_image,CV_32FC3,1.0/255.0);
    cv::resize(whole_image,whole_image,img.size());
    img.convertTo(img,CV_32FC3,1.0/255.0);

    Mat bg=Mat(img.size(),CV_32FC3);
    bg=Scalar(1.0,1.0,1.0);

    // Prepare mask
    Mat mask;
    Mat img_gray;
    cv::cvtColor(img,img_gray,cv::COLOR_BGR2GRAY);
    img_gray.convertTo(mask,CV_32FC1);
    threshold(1.0-mask,mask,0.9,1.0,cv::THRESH_BINARY_INV);

    cv::GaussianBlur(mask,mask,Size(21,21),11.0);
    imshow("result",mask);
    cv::waitKey(0);


        // Reget the image fragment with smoothed mask
    Mat res;

    vector<Mat> ch_img(3);
    vector<Mat> ch_bg(3);
    cv::split(whole_image,ch_img);
    cv::split(bg,ch_bg);
    ch_img[0]=ch_img[0].mul(mask)+ch_bg[0].mul(1.0-mask);
    ch_img[1]=ch_img[1].mul(mask)+ch_bg[1].mul(1.0-mask);
    ch_img[2]=ch_img[2].mul(mask)+ch_bg[2].mul(1.0-mask);
    cv::merge(ch_img,res);
    cv::merge(ch_bg,bg);

    imshow("result",res);
    cv::waitKey(0);
    cv::destroyAllWindows();
}
#包括
#包括
#包括
#包括
#包括
使用名称空间cv;
使用名称空间std;
int main(int argc,字符**argv)
{
cv::namedWindow(“结果”);
Mat img=imread(“TestImg.png”);
Mat-total_image=imread(“D:\\ImagesForTest\\lena.jpg”);
整张图像。转换为(整张图像,CV_32FC3,1.0/255.0);
cv::resize(整张图片,整张图片,img.size());
img.convertTo(img,CV_32FC3,1.0/255.0);
Mat bg=Mat(img.size(),CV_32FC3);
bg=标量(1.0,1.0,1.0);
//准备口罩
垫罩;
Mat img_gray;
cv::CVT颜色(img、img_灰色、cv::颜色_BGR2灰色);
图像灰度转换(掩模,CV_32FC1);
阈值(1.0-mask,mask,0.9,1.0,cv::THRESH_BINARY_INV);
cv::GaussianBlur(掩模,掩模,尺寸(21,21),11.0);
imshow(“结果”,掩码);
cv::waitKey(0);
//使用平滑遮罩重新设置图像片段
材料;
向量ch_-img(3);
载体chu-bg(3);
cv::分割(整个图像,CHU图像);
cv::拆分(bg,CHU bg);
CHU img[0]=CHU img[0]。mul(掩码)+CHU bg[0]。mul(1.0-掩码);
CHU img[1]=CHU img[1]。mul(掩码)+CHU bg[1]。mul(1.0-mask);
ch_-img[2]=ch_-img[2]。mul(mask)+ch_-bg[2]。mul(1.0-mask);
cv::合并(CHU img,res);
cv::合并(ch_bg,bg);
imshow(“结果”,res);
cv::waitKey(0);
cv::destroyAllWindows();
}

我想这个链接也会让你感兴趣:

我已经按照以下步骤平滑了从GrabCut获得的前景边缘

  • 从我从GrabCut得到的蒙版创建一个二进制图像
  • 找到二值图像的轮廓
  • 通过绘制轮廓点创建边遮罩。它给出了我从GrabCut获得的前景图像的边界边缘
  • 然后按照中定义的步骤进行操作

  • @我需要帮助。我正在尝试按照你在这里所说的步骤@herohuyongtao你能帮忙吗?@berak你能帮忙吗?谢谢你的回答,但我不想这样输出,我已经更新了我的问题,看看你能不能帮忙,谢谢。我已经更改了我的答案。希望你能理解这个想法。太好了,我试试看。。谢谢:-)当我尝试实现上面的逻辑时,我得到了这样的结果,它似乎做得很正确,但输出非常不同。。任何想法。看起来CV_8UC3/CV_8UC1和CV_32FC3/CV_32FC1图像类型有问题。第一个的范围为0-255,第二个的范围为0-1。尝试将使用的图像转换为CV_32FC3/CV_32FC1类型,并按系数1.0/255.0进行缩放。我怀疑您使用的掩码图像中的值在0-255范围内,而不是0-1。
    #include <iostream>
    #include <vector>
    #include <string>
    #include <fstream>
    #include <opencv2/opencv.hpp>
    
    using namespace cv;
    using namespace std;
    
    int main(int argc, char **argv)
    {
        cv::namedWindow("result");
        Mat img=imread("TestImg.png");
        Mat whole_image=imread("D:\\ImagesForTest\\lena.jpg");
        whole_image.convertTo(whole_image,CV_32FC3,1.0/255.0);
        cv::resize(whole_image,whole_image,img.size());
        img.convertTo(img,CV_32FC3,1.0/255.0);
    
        Mat bg=Mat(img.size(),CV_32FC3);
        bg=Scalar(1.0,1.0,1.0);
    
        // Prepare mask
        Mat mask;
        Mat img_gray;
        cv::cvtColor(img,img_gray,cv::COLOR_BGR2GRAY);
        img_gray.convertTo(mask,CV_32FC1);
        threshold(1.0-mask,mask,0.9,1.0,cv::THRESH_BINARY_INV);
    
        cv::GaussianBlur(mask,mask,Size(21,21),11.0);
        imshow("result",mask);
        cv::waitKey(0);
    
    
            // Reget the image fragment with smoothed mask
        Mat res;
    
        vector<Mat> ch_img(3);
        vector<Mat> ch_bg(3);
        cv::split(whole_image,ch_img);
        cv::split(bg,ch_bg);
        ch_img[0]=ch_img[0].mul(mask)+ch_bg[0].mul(1.0-mask);
        ch_img[1]=ch_img[1].mul(mask)+ch_bg[1].mul(1.0-mask);
        ch_img[2]=ch_img[2].mul(mask)+ch_bg[2].mul(1.0-mask);
        cv::merge(ch_img,res);
        cv::merge(ch_bg,bg);
    
        imshow("result",res);
        cv::waitKey(0);
        cv::destroyAllWindows();
    }