我想用k-means和OpenCV在C++界面(cv命名空間)中張貼圖像,我得到奇怪的結果。我需要它來減少一些噪音。這是我的代碼:OpenCV使用k-means來張貼圖像
#include "cv.h"
#include "highgui.h"
using namespace cv;
int main() {
Mat imageBGR, imageHSV, planeH, planeS, planeV;
imageBGR = imread("fruits.jpg");
imshow("original", imageBGR);
cv::Mat labels, data;
cv::Mat centers(8, 1, CV_32FC1);
imageBGR.convertTo(data, CV_32F);
cv::kmeans(data, 8, labels,
cv::TermCriteria(CV_TERMCRIT_ITER, 10, 1.0),
3, cv::KMEANS_PP_CENTERS, ¢ers);
imshow("posterized hue", data);
data.convertTo(data, CV_32FC3);
waitKey();
return 0;
}
,但我得到一個奇怪的結果
第一張圖片:原
2圖像:後K-均值。
有什麼建議嗎?
更新:正確的解決方案。也許有人可以幫助我優化代碼?
#include "cv.h"
#include "highgui.h"
#include <iostream>
using namespace cv;
using namespace std;
int main() {
Mat src;
src = imread("fruits.jpg");
imshow("original", src);
blur(src, src, Size(15,15));
imshow("blurred", src);
Mat p = Mat::zeros(src.cols*src.rows, 5, CV_32F);
Mat bestLabels, centers, clustered;
vector<Mat> bgr;
cv::split(src, bgr);
// i think there is a better way to split pixel bgr color
for(int i=0; i<src.cols*src.rows; i++) {
p.at<float>(i,0) = (i/src.cols)/src.rows;
p.at<float>(i,1) = (i%src.cols)/src.cols;
p.at<float>(i,2) = bgr[0].data[i]/255.0;
p.at<float>(i,3) = bgr[1].data[i]/255.0;
p.at<float>(i,4) = bgr[2].data[i]/255.0;
}
int K = 8;
cv::kmeans(p, K, bestLabels,
TermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0),
3, KMEANS_PP_CENTERS, centers);
int colors[K];
for(int i=0; i<K; i++) {
colors[i] = 255/(i+1);
}
// i think there is a better way to do this mayebe some Mat::reshape?
clustered = Mat(src.rows, src.cols, CV_32F);
for(int i=0; i<src.cols*src.rows; i++) {
clustered.at<float>(i/src.cols, i%src.cols) = (float)(colors[bestLabels.at<int>(0,i)]);
// cout << bestLabels.at<int>(0,i) << " " <<
// colors[bestLabels.at<int>(0,i)] << " " <<
// clustered.at<float>(i/src.cols, i%src.cols) << " " <<
// endl;
}
clustered.convertTo(clustered, CV_8U);
imshow("clustered", clustered);
waitKey();
return 0;
}
結果:
這可能僅僅是因爲你需要更多的迭代和/或更小的epsilon。我建議你現在嘗試移除「CV_TERMCRIT_EPS」,並使用TermCriteria中的迭代次數。看看是否有幫助。 – 2012-03-06 09:22:14
我只是接近計算機視覺,圖像處理和機器學習,但對我來說,我在做什麼,而不僅僅是一個參數微調,另一個錯誤。 – nkint 2012-03-06 12:19:54
我不是說你開始參數調整,我是建議您簡化代碼以測試您嘗試的最基本形式。刪除epsilon並增加迭代次數可消除不必要的欺騙。 – 2012-03-06 12:31:00