Ask Your Question

Revision history [back]

Smoothing edges change black color

I am getting foreground image from grabCut algorithm and then i apply below algorithm to smooth its edges. It is working fine and smoothing edges but it is also changing black color in the image.

You can see for this image it is working fine for this image image description but for this image it is changing black color image description
please tell me how to fix this.

This is my code for edge smoothing and i got it from Image edge smoothing with opencv

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

using namespace cv;
using namespace std;

int main(int argc, char **argv)
{
namedWindow("originalImage");
namedWindow("grabCutImage");
namedWindow("smoothImage");

Mat originalImage = imread("../data/original_image_1.jpg");
Mat grabCutImage = imread("../data/grab_cut_image_1.png"); // got from grabcut algorithm

originalImage.convertTo(originalImage, CV_32FC3, 1.0 / 255.0);
resize(originalImage, originalImage, grabCutImage.size());
grabCutImage.convertTo(grabCutImage, CV_32FC3, 1.0 / 255.0);

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

Mat mask;
Mat img_gray;
cvtColor(grabCutImage, img_gray, COLOR_BGR2GRAY);
img_gray.convertTo(mask, CV_32FC1);
threshold(1.0 - mask, mask, 0.9, 1.0, THRESH_BINARY_INV);

GaussianBlur(mask, mask, Size(21, 21), 11.0);

Mat smooth;

vector<Mat> ch_img(3);
vector<Mat> ch_bg(3);
split(originalImage, ch_img);
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);
merge(ch_img, smooth);
merge(ch_bg, bg);

imshow("originalImage", originalImage);
imshow("grabCutImage", grabCutImage);
imshow("smoothImage", smooth);
waitKey(0);
destroyAllWindows();
}

here are images i am using

image description image description image description image description

Smoothing edges change black color

I am getting foreground image from grabCut algorithm and then i apply below algorithm to smooth its edges. It is working fine and smoothing edges but it is also changing black color in the image.

You can see for this image it is working fine for this image image description but for this image it is changing black color image description
please tell me how to fix this.

This is my code for edge smoothing and i got it from Image edge smoothing with opencv

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

using namespace cv;
using namespace std;

int main(int argc, char **argv)
{
namedWindow("originalImage");
namedWindow("grabCutImage");
namedWindow("smoothImage");

Mat originalImage = imread("../data/original_image_1.jpg");
Mat grabCutImage = imread("../data/grab_cut_image_1.png"); // got from grabcut algorithm

originalImage.convertTo(originalImage, CV_32FC3, 1.0 / 255.0);
resize(originalImage, originalImage, grabCutImage.size());
grabCutImage.convertTo(grabCutImage, CV_32FC3, 1.0 / 255.0);

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

Mat mask;
Mat img_gray;
cvtColor(grabCutImage, img_gray, COLOR_BGR2GRAY);
img_gray.convertTo(mask, CV_32FC1);
threshold(1.0 - mask, mask, 0.9, 1.0, THRESH_BINARY_INV);

GaussianBlur(mask, mask, Size(21, 21), 11.0);

Mat smooth;

vector<Mat> ch_img(3);
vector<Mat> ch_bg(3);
split(originalImage, ch_img);
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);
merge(ch_img, smooth);
merge(ch_bg, bg);

imshow("originalImage", originalImage);
imshow("grabCutImage", grabCutImage);
imshow("smoothImage", smooth);
waitKey(0);
destroyAllWindows();
}

here are images i am using

image description image description image description image description

Smoothing edges change black color

I am getting foreground image from grabCut algorithm and then i apply below algorithm to smooth its edges. It is working fine and smoothing edges but it is also changing black color in the image.

You can see for this image it is working fine for this image image description but for this image it is changing black color image description
please tell me how to fix this.

This is my code for edge smoothing and i got it from Image edge smoothing with opencv

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

using namespace cv;
using namespace std;

int main(int argc, char **argv)
{
namedWindow("originalImage");
namedWindow("grabCutImage");
namedWindow("smoothImage");

Mat originalImage = imread("../data/original_image_1.jpg");
Mat grabCutImage = imread("../data/grab_cut_image_1.png"); // got from grabcut algorithm

originalImage.convertTo(originalImage, CV_32FC3, 1.0 / 255.0);
resize(originalImage, originalImage, grabCutImage.size());
grabCutImage.convertTo(grabCutImage, CV_32FC3, 1.0 / 255.0);

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

Mat mask;
Mat img_gray;
cvtColor(grabCutImage, img_gray, COLOR_BGR2GRAY);
img_gray.convertTo(mask, CV_32FC1);
threshold(1.0 - mask, mask, 0.9, 1.0, THRESH_BINARY_INV);

GaussianBlur(mask, mask, Size(21, 21), 11.0);

Mat smooth;

vector<Mat> ch_img(3);
vector<Mat> ch_bg(3);
split(originalImage, ch_img);
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);
merge(ch_img, smooth);
merge(ch_bg, bg);

imshow("originalImage", originalImage);
imshow("grabCutImage", grabCutImage);
imshow("smoothImage", smooth);
waitKey(0);
destroyAllWindows();
}

here are images i am using

image description image description image description image description