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
but for this image it is changing black color
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