图像边缘平滑与opencv
我正在尝试使用opencv框架来平滑输出图像的边缘,我正在尝试以下步骤。 从这里采取步骤https://stackoverflow.com/a/17175381/790842
int lowThreshold = 10.0; int ratio = 3; int kernel_size = 3; Mat src_gray,detected_edges,dst,blurred; /// Convert the image to grayscale cvtColor( result, src_gray, CV_BGR2GRAY ); /// Reduce noise with a kernel 3x3 cv::blur( src_gray, detected_edges, cv::Size(5,5) ); /// Canny detector cv::Canny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size ); //Works fine upto here I am getting perfect edge mask cv::dilate(detected_edges, blurred, result); //I get Assertion failed (src.channels() == 1 && func != 0) in countNonZero ERROR while doing dilate result.copyTo(blurred, blurred); cv::blur(blurred, blurred, cv::Size(3.0,3.0)); blurred.copyTo(result, detected_edges); UIImage *image = [UIImageCVMatConverter UIImageFromCVMat:result];
无论我是否以正确的方式行事,或者我错过了什么,我都需要帮助。
感谢您的任何build议和帮助。
更新:
我有一个像下面的图像抓取algorithm,现在我想申请边平滑图像,你可以看到图像不平滑。
你想得到这样的东西吗?
如果是,那么这里是代码:
#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(); }
我认为这个链接也会对你有所帮助: 泊松混合
我遵循以下步骤来平滑从GrabCut获得的前景的边缘。
- 从我从GrabCut获得的面具创build一个二进制图像。
- find二进制图像的轮廓。
- 通过绘制轮廓点来创build边缘蒙版。 它给出了我从GrabCut获得的前景图像的边界边缘。
- 然后按照https://stackoverflow.com/a/17175381/790842中的步骤进行操作