PDA

View Full Version : الگوریتم برای کاهش تعداد رنگهای تصویر



salamlar
پنج شنبه 29 فروردین 1392, 08:44 صبح
سلام
نیاز به یه الگوریتم دارم که بتونم باهاش تعداد رنگهای موجود در یه تصویر رنگی رو کاهش بدم (یعنی در کل میخوام رنگهای تصویر رو محدود و واقعی سازی کنم مثل نرم افزار های تبدیل عکس به نقشه تابلوفرش کامپیوتری که می خوام بدونم از چه الگوریتم و روشی واسه این کار استفاده می کنن؟؟؟)

مثلا عکسی که 500 نوع رنگ داره رو بازتولید کنم با 50 تا رنگ طوریکه کیفیت زیاد افت نکنه

محیطی که توش کار میکنم c# هست

واسه پروژه پایانیم میخوام ضروریه
با تشکر

مصطفی ساتکی
پنج شنبه 29 فروردین 1392, 11:23 صبح
تو این تاپیک (http://barnamenevis.org/showthread.php?344254-%DA%A9%D8%A7%D9%87%D8%B4-%D8%B1%D9%86%DA%AF) توضیح دادم اگر کد C هم خواستید بفرمایید تا قرار بدم.

salamlar
پنج شنبه 29 فروردین 1392, 23:13 عصر
تو این تاپیک (http://barnamenevis.org/showthread.php?344254-%DA%A9%D8%A7%D9%87%D8%B4-%D8%B1%D9%86%DA%AF) توضیح دادم اگر کد C هم خواستید بفرمایید تا قرار بدم.

سلام
خیلی ممنون استاد
اگه ممکنه اون کد c رو هم که فرمودین لطف کنین
باتشکر

مصطفی ساتکی
یک شنبه 01 اردیبهشت 1392, 09:04 صبح
این هم کد مربوط به 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);
}