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