上次写了一个KMeans的原理与实现Kmeans原理。这次使用图片进行一个实例的样本数据分割,简单来说就是对图片的各种像素值,分割为几个指定类的颜色值。
最常见的应用就是实现证件照的底色替换,或者是图像主色彩的替换,当然要完美分割不但需要KMeans的方法,还需要一些别的操作比如边缘修整等方法。
预备工作
1.将像素点作为单独的样本
在此需要使用opencv的mat函数reshape实现,便可实现将Mat对象变换到我们的样本数据
Mat cv::Mat::reshape(
int cn,
int rows = 0
)const
cn是维度,即分割为多少列,rows是图片的样本个数,即行×列
2.代码演示(C++版本)
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = imread("toux.jpg");
if (src.empty()) {
printf("could not load image...\n");
return -1;
}
namedWindow("input image", WINDOW_AUTOSIZE);
imshow("input image", src);
Scalar colorTab[] = {
Scalar