#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("D:/picture/zheng.png");
Mat gray, binary;
/*cvtColor(img, gray, COLOR_BGR2GRAY);
threshold(gray, gray, 110, 255,THRESH_BINARY);
imshow("1", gray);*/
Mat red = Mat(img.size(), CV_8UC3, Scalar(0, 0, 255));
// 2.使用K-means聚类;分离出背景色
Mat sample_data = img.reshape(3, img.rows * img.cols);
Mat data;
sample_data.convertTo(data, CV_32F);
int numCluster = 4;
Mat labels;
TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 0.1);
kmeans(data, numCluster, labels, criteria, 3, KMEANS_PP_CENTERS);
// 3.背景与人物二值化
Mat mask = Mat::zeros(img.size(), CV_8UC1);
int index = img.rows * 2 + 2; //获取点(2,2)作为背景色
int cindex = labels.at<int>(index);
/* 提取背景特征 */
for (int row = 0; row < img.rows; row++) {
for (int col = 0; col < img.cols; col++) {
index = row * img.cols + col;
int label = labels.at<int>(index);
if (label == cindex) { // 背景
mask.at<uchar>(row, col) = 0;
}
else {
mask.at<uchar>(row, col) = 255;
}
}
}
imshow("mask", mask);
img.copyTo(red, mask);
GaussianBlur(red, red, Size(7, 7), 0);
Mat sky = imread("D:/picture/sky.png");
img.copyTo(sky, mask);
imshow("red", red);
imwrite("mask.png", mask);
imwrite("red.png", red);
imwrite("sky.png",sky);
waitKey();
}
抠图 更换背景
最新推荐文章于 2024-01-10 13:25:53 发布