این کد تصویر رنگی را بدون مشکل نمایش می دهد ولی وقتی تصویر خاکستری به آن می دهم، تصویر را سه بار کنار هم تکرار می کند.
اگر کد را به صورت زیر تغییر دهم، تصویر یک بار نمایش داده می شود ولی با رنگهای نادرست:
كد:
System::Drawing::Bitmap^ b = gcnew System::Drawing::Bitmap(grayImage.cols,grayImage.rows,grayImage.step,System::Drawing::Imaging::PixelFormat::Format8bppIndexed,ptr);
ممنون می شم اگه راهنمایی کنید که چه تغییری در کد باید ایجاد کنم تا تصویر خاکستری به صورت صحیح نمایش داده بشه
این کد تصویر رنگی را بدون مشکل نمایش می دهد ولی وقتی تصویر خاکستری به آن می دهم، تصویر را سه بار کنار هم تکرار می کند.
ممنون می شم اگه راهنمایی کنید که چه تغییری در کد باید ایجاد کنم تا تصویر خاکستری به صورت صحیح نمایش داده بشه
به نام خدا
تصویر خاکستری که می فرمایید سه بار نمایش داده میشه از کجا بدست آمده؟ خودتان تولید می کنید یا از فایل می خوانید.
ممکن است اگر از فایل می خوانید آن تصویر ظاهرا سیاه و سفید باشد ولی واقعا در قالب یک فایل رنگی ذخیره شده باشد.
حتما می دانید اگر مقادیر سه لایه r, b, g دارای مقدار یکسان باشند تصویر سیاه و سفید دیده می شود ولی در حقیقت سه لایه دارد.
بررسی کنید اگر نشد مجدد بحث رو دنبال می کنیم
موفق باشید
.
__________________
.
.
.
برای تشکر دکمه مخصوص وجود دارد لطفا پست هرز ایجاد نکنید
.
.
اینقدر از دسترسی نداشتن به مقاله شیون نکنید
مقالات انگلیسی: ایران سای (ISI, IEEE, ACM)
مقالات فارسی: سیویلیکا (کنفرانس داخلی)
مقالات فارسی: مگ ایران (ژورنالهای داخلی)
تصویری که سه بار نمایش داده می شود تصویری است که توسط دستور imread از ورودی خوانده ام و با دستور
كد:
cvtColor( src, src_gray, CV_BGR2GRAY );
به تصویر خاکستری تبدیل کردم. اگر با دستور imshow آن را نمایش بدهم مشکلی وجود ندارد و تصویر سطح خاکستری به درستی نمایش داده می شود ولی وقتی در pictureBox نشان داده می شود مشکلاتی که گفتم پیش می آید.
احتمالاً علت سه بار نمایش دادن آن هم این است که هر سه لایه r، g و b را کنار هم نمایش می دهد و چون تبدیل به سطح خاکستری شده هر سه سیاه و سفید هستند ولی مشکل این است که نمی دانم چطور باید فقط یکی را نمایش بدهم.
ضمناً اگر از Format24bppRgb استفاده کنم سه تصویر خاکستری کنار هم می دهد، اگر از Format16bppGrayScale استفاده کنم خطا می دهد و اگر از Format8bppIndexed استفاده کنم یک تصویر با رنگ های نادرست نشان می دهد. متاسفانه نتوانستم خروجی را اینجا قرار دهم تا نتیجه را ببینید.
متشکرم
به نظر من دستور cvtColor به این صورت که نوشتید تصویر رنگی رو به تصویر خاکستری تبدیل می کنه
یعنی یه تصویر با سه کانال به یه کانال تبدیل میشه
این طوری نیست که می گین همون سه کاناله با مقادیر یکسان.
فکر نکنم این طوری باشه. همون خروجیش یه کانالست
خیلی راحت وقتی خط به خط اجرا می کنین چک کنین ببینین src_gray یه کانالست یا سه کاناله
که احتمالا یه کاناله باید باشه یعنی CV_8UC1 هست
تصویری که سه بار نمایش داده می شود تصویری است که توسط دستور imread از ورودی خوانده ام و با دستور
كد:
cvtColor( src, src_gray, CV_BGR2GRAY );
احتمالاً علت سه بار نمایش دادن آن هم این است که هر سه لایه r، g و b را کنار هم نمایش می دهد و چون تبدیل به سطح خاکستری شده هر سه سیاه و سفید هستند ولی مشکل این است که نمی دانم چطور باید فقط یکی را نمایش بدهم.
متشکرم
به نام خدا
قطعه کد زیر را ببینید، ان شاالله مشکلتان را حل کند (پارامتر IPL_DEPTH_8U در حل مشکل شما کلیدی است)
كد:
// C
IplImage *im_rgb = cvLoadImage("image.jpg");
IplImage *im_gray = cvCreateImage(cvGetSize(im_rgb),IPL_DEPTH_8U,1);
cvCvtColor(im_rgb,im_gray,CV_RGB2GRAY);
// C++
Mat im_rgb = imread("image.jpg");
Mat im_gray;
cvtColor(im_rgb,im_gray,CV_RGB2GRAY);
__________________
.
.
.
برای تشکر دکمه مخصوص وجود دارد لطفا پست هرز ایجاد نکنید
.
.
اینقدر از دسترسی نداشتن به مقاله شیون نکنید
مقالات انگلیسی: ایران سای (ISI, IEEE, ACM)
مقالات فارسی: سیویلیکا (کنفرانس داخلی)
مقالات فارسی: مگ ایران (ژورنالهای داخلی)
به نظر من دستور cvtColor به این صورت که نوشتید تصویر رنگی رو به تصویر خاکستری تبدیل می کنه
یعنی یه تصویر با سه کانال به یه کانال تبدیل میشه
این طوری نیست که می گین همون سه کاناله با مقادیر یکسان.
فکر نکنم این طوری باشه. همون خروجیش یه کانالست
خیلی راحت وقتی خط به خط اجرا می کنین چک کنین ببینین src_gray یه کانالست یا سه کاناله
که احتمالا یه کاناله باید باشه یعنی CV_8UC1 هست
شما درست می گید. تصویر با سه کانال به یه کانال تبدیل شد. پس چرا pictureBox همچین خروجی می ده؟
به نام خدا
قطعه کد زیر را ببینید، ان شاالله مشکلتان را حل کند (پارامتر IPL_DEPTH_8U در حل مشکل شما کلیدی است)
كد:
// C
IplImage *im_rgb = cvLoadImage("image.jpg");
IplImage *im_gray = cvCreateImage(cvGetSize(im_rgb),IPL_DEPTH_8U,1);
cvCvtColor(im_rgb,im_gray,CV_RGB2GRAY);
// C++
Mat im_rgb = imread("image.jpg");
Mat im_gray;
cvtColor(im_rgb,im_gray,CV_RGB2GRAY);
متاسفانه این راه هم جواب نداد. البته من کد شما رو به این صورت در C++ نوشتم:
كد:
Mat src_gray (src.size(), CV_8U);
ولی وقتی به صورت IPL_DEPTH_8U,1 هم نوشتم باز نتیجه همان شد