الگوریتم برای کاهش تعداد رنگهای تصویر
سلام
نیاز به یه الگوریتم دارم که بتونم باهاش تعداد رنگهای موجود در یه تصویر رنگی رو کاهش بدم (یعنی در کل میخوام رنگهای تصویر رو محدود و واقعی سازی کنم مثل نرم افزار های تبدیل عکس به نقشه تابلوفرش کامپیوتری که می خوام بدونم از چه الگوریتم و روشی واسه این کار استفاده می کنن؟؟؟)
مثلا عکسی که 500 نوع رنگ داره رو بازتولید کنم با 50 تا رنگ طوریکه کیفیت زیاد افت نکنه
محیطی که توش کار میکنم C# هست
واسه پروژه پایانیم میخوام ضروریه
با تشکر
نقل قول: الگوریتم برای کاهش تعداد رنگهای تصویر
تو این تاپیک توضیح دادم اگر کد C هم خواستید بفرمایید تا قرار بدم.
نقل قول: الگوریتم برای کاهش تعداد رنگهای تصویر
نقل قول:
نوشته شده توسط
mostafa.sataki
تو
این تاپیک توضیح دادم اگر کد C هم خواستید بفرمایید تا قرار بدم.
سلام
خیلی ممنون استاد
اگه ممکنه اون کد c رو هم که فرمودین لطف کنین
باتشکر
نقل قول: الگوریتم برای کاهش تعداد رنگهای تصویر
این هم کد مربوط به quantization یا کاهش تعداد رنگ که به زیان C++ و استفاده از کتابخانه OpenCV هستش.
void bhQuantizeImage(const IplImage* srcImage,IplImage* dstImage,int colorCount)
{
int i, size;
CvMat *clusters;
CvMat *points;
CvMat *color = cvCreateMat (colorCount, 1, CV_32FC3);
CvMat *count = cvCreateMat (colorCount, 1, CV_32SC1);
size = srcImage->width * srcImage->height;
IplImage* dstImg = cvCreateImage(cvGetSize(dstImage),dstImage->depth,dstImage->nChannels);
clusters = cvCreateMat (size, 1, CV_32SC1);
points = cvCreateMat (size, 1, CV_32FC3);
for (i = 0; i < size; i++)
{
points->data.fl[i * 3 + 0] = (uchar) srcImage->imageData[i * 3 + 0];
points->data.fl[i * 3 + 1] = (uchar) srcImage->imageData[i * 3 + 1];
points->data.fl[i * 3 + 2] = (uchar) srcImage->imageData[i * 3 + 2];
}
cvKMeans2 (points, colorCount, clusters, cvTermCriteria (CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 10, 1.0));
cvSetZero (color);
cvSetZero (count);
for (i = 0; i < size; i++)
{
int idx = clusters->data.i[i];
int j = ++count->data.i[idx];;
color->data.fl[idx * 3 + 0] = color->data.fl[idx * 3 + 0] * (j - 1) / j + points->data.fl[i * 3 + 0] / j;
color->data.fl[idx * 3 + 1] = color->data.fl[idx * 3 + 1] * (j - 1) / j + points->data.fl[i * 3 + 1] / j;
color->data.fl[idx * 3 + 2] = color->data.fl[idx * 3 + 2] * (j - 1) / j + points->data.fl[i * 3 + 2] / j;
}
for (i = 0; i < size; i++)
{
int idx = clusters->data.i[i];
dstImg->imageData[i * 3 + 0] = (char) color->data.fl[idx * 3 + 0];
dstImg->imageData[i * 3 + 1] = (char) color->data.fl[idx * 3 + 1];
dstImg->imageData[i * 3 + 2] = (char) color->data.fl[idx * 3 + 2];
}
cvCopyImage(dstImg,dstImage);
cvReleaseImage(&dstImg);
cvReleaseMat (&clusters);
cvReleaseMat (&points);
cvReleaseMat (&color);
cvReleaseMat (&count);
}