#Java OpenCvのkmeansを使って減色
画像処理で減色しようと思い、k-means法を利用したときハマったのでメモ。
参考:減色処理:Core.kmeans
##目的
参考サイト見ながら減色処理しようとしたけど、期待する画像が出力されない・・・。
下サイトでやってるような処理結果が欲しい!
k-meansクラスタリングによる画像分割,減色
##方法・コード
BGR画像をk-meansで減色して、出力されるようコードを編集しました。
cluster
public static Mat cluster(Mat cutout, int k) {
Mat samples = cutout.reshape(1, cutout.cols() * cutout.rows());
Mat samples32f = new Mat();
samples.convertTo(samples32f, CvType.CV_32F, 1.0 / 255.0);
Mat labels = new Mat();
TermCriteria criteria = new TermCriteria(TermCriteria.COUNT, 100, 1);
Mat centers = new Mat();
Core.kmeans(samples32f, k, labels, criteria, 1, Core.KMEANS_PP_CENTERS, centers);
centers.convertTo(centers, CvType.CV_8UC1, 255.0);
centers.reshape(3);
Mat dst = cutout.clone();
int rows = 0;
for(int y = 0; y < cutout.rows(); y++) {
for(int x = 0; x < cutout.cols(); x++) {
int label = (int)labels.get(rows, 0)[0];
int r = (int)centers.get(label, 2)[0];
int g = (int)centers.get(label, 1)[0];
int b = (int)centers.get(label, 0)[0];
dst.put(y, x, b,g,r);
rows++;
}
}
return dst;
}
いいね!
以上!