पोस्टरइज़ करने के लिए के-साधन का उपयोग करके ओपनसीवी सी ++ इंटरफ़ेस (सीवी नेमस्पेस) में के-साधन और ओपनसीवी के साथ एक छवि पोस्टरइज़ करना चाहता हूं और मुझे अजीब परिणाम मिलते हैं। मुझे कुछ शोर को कम करने के लिए इसकी ज़रूरत है। यह मेरा कोड है:ओपनसीवी एक छवि
#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;
}
लेकिन मैं एक अजीब परिणाम प्राप्त
पहले छवि: मूल
दूसरा छवि: 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;
}
परिणाम:
यह सिर्फ हो सकता है कि आप और अधिक पुनरावृत्तियों की जरूरत है और/या एक छोटा ईपीएसलॉन। मेरा सुझाव है कि आप अभी के लिए "CV_TERMCRIT_EPS" को हटाने का प्रयास करें, और अपने टर्मक्रिटिया में पुनरावृत्तियों की संख्या के साथ खेलो। देखें कि क्या मदद करता है। –
मैं सिर्फ कंप्यूटर दृष्टि, छवि प्रसंस्करण और मशीन सीखने के करीब आ रहा हूं लेकिन मेरे लिए एक और गलती है जो मैं कर रहा हूं और न केवल पैरामीटर ठीक ट्यूनिंग .. – nkint
मैं आपको पैरामीटर ट्यूनिंग शुरू करने का सुझाव नहीं दे रहा हूं, मैं हूं यह सुझाव देने के लिए कि आप जो कोशिश कर रहे हैं उसका सबसे बुनियादी रूप में काम करने के लिए आप अपने कोड को सरल बनाते हैं। ईपीएसलॉन को हटाने और पुनरावृत्तियों की संख्या में वृद्धि अनियंत्रित चालबाजी को हटा देती है। –