رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران

پست های پیشنهاد شده

در جلسه قبل کتابخانه را دانلود و نصب کردیم و برای تست کدی را اجرا کردیم که حاصل ان نمایش یک تصویر در یک پنجره بود اما درباره ی کلاس Matو همچنین توابع imread،imshow،waitKey توضیحی ندادیم کلاس Mat یک ماتریس است که تا هر چند بعد را در خود ذخیره میکند تابع imread برای بارگذاری تصویر است که تصویر را  خوانده و در قالب یک ماتریس برمیگرداند که اینجا تصویر دو بعد دارد RowوColumn وقتی تصویر بارگذاری شد باید در یک ماتریس ذخیره شود پس به یک ماتریس نیاز داریم که همونطور که دیدید تعریف کردیم تابع imshow برای نمایش تصویر است ورودی اول این تابع نام پنجره است و ورودی دوم یک InputArray است که یک ورودی از ارایه از ما میخواهد در اینجا ما از هر کلاس کانتینری یا حتی ارایه معمولی هم بدهیم قبول میکند چون از ما یک ورودی ارایه میخواهد فرقی نمی کند که این ورودی چگونه و از چه نوعی باشد اما چون این یک تصویر را نمایش میدهد باید ورودی بدهیم که حاوی داده های تصویر باشد نه چیز دیگری پس به این موضوع هم دقت کنید تابع waitKey  منتظر می ماند تا بعد از نمایش تصویر و فشردن کلیدی از صحفه کلید به برنامه پایان دهد. در این جلسه به کلاس Image Filtering توابع کاربری ان میپردازیم ابتدا چند تابع  این کلاس را توضیح خواهم داد و سپس از هر کدام یک مثال خواهم زد.
چند تابع که این کلاس دارد عبارتند از:bilateralFilter،blur،boxFilterLaplacian،medianBlur این چند تابع هر کدام فیلتری رو تصویر اعمال میکنند در هنگام دادن ورودی به توابع به ان چیزی که میخواهد توجه کنید و مقادیر صحیح را به ورودی توابع بدهید که به خطا مواجه نشوید در غیر اینصورت به مشکل برمیخورید.
تابع bilateralFilter: یک محدوده ی مشخص شده توسط پارامتر سوم را با اندازه های داده شده در پارامتر های چهارم و پنجم را که مشخص کنند رنگ و فاصله هستند ترکیب میکند پارامتر سوم مشخص میکند در چه محدودهای از پیکسل های تصویر شروع به ترکیب رنگ در فاصله ی داده شده در پارامتر پنجم کند این محدوده اگر کوچکتر از پارامتر های چهارم و پنجم باشد بخشی از پیکسلها را در برمیگیرد اگر در پارامتر های چهارم و پنجم اندازه ی بیش از حد بدهیم و اندازه ی پارامتر سوم بیش از حد کوچک باشد تصویر به حالت کدر در می اید در غیر اینصورت اگر پارامتر ها بدرستی تنظیم شده باشند یک ترکیب رنگ زیبا در تصویر را خواهیم داشت این ترکیب رنگ در خود تصویر است به مثال زیر دقت کنید:
#include <opencv2\opencv.hpp>
#include <Windows.h>
using namespace cv;
int main()
{
	Mat output_image;
	Mat image_read = imread("C:\\Users\\Mohamad4030\\Desktop\\beautiful-sunset-sunrise-photo-5.jpg", IMREAD_COLOR);
	bilateralFilter(image_read, output_image, 100, 300, 500);
	imshow("befor", image_read);//befor Filtering
	imshow("after", output_image);//after Filtering
	ShowWindow(GetConsoleWindow(), SW_HIDE);
	waitKey(0);
}
حاصل اجرای کد بالا به صورت زیر خواهد بود:

8ezd_b.jpg

تابع blur: با دریافت عرض و ارتفاع و موقعیت xوy در تصویر حالت تاری را به وجود می اورد باید دقت کنید موقعیت باید به همان اندازه مشخص شود که در عرض و ارتفاع مشخص میشود بیشتر از عرض و ارتفاع باشد برنامه متوقف خواهد شد چون نباید بزرگتر از عرض و ارتفاع باشد  هر چه موقعیت بیشتر باشد تاری در ان موقعیت بیشتر میشود به مثال زیر دقت کنید:
#include <opencv2\opencv.hpp>
#include <Windows.h>
using namespace cv;
int main()
{
	Mat output_image;
	Mat image_read = imread("C:\\Users\\Mohamad4030\\Desktop\\beautiful-sunset-sunrise-photo-5.jpg", IMREAD_COLOR);
	//bilateralFilter(image_read, output_image, 100, 300, 500);
	blur(image_read, output_image, Size(100, 100),Point(99,99));
	imshow("befor", image_read);//befor Filtering
	imshow("after", output_image);//after Filtering
	ShowWindow(GetConsoleWindow(), SW_HIDE);
	waitKey(0);
}
حاصل اجرای کد بالا به صورت زیر خواهد بود:
2ccj_blur.jpg
 
برای بهتر متوجه شدن این تابع چند بار موقعیت xوy را تغییر دهید و نتیجه را ببینید.
تابع boxFilter: با مشخص کردن عمق برای تصویر و عرض و ارتفاع و موقعیت xوy ان منطقه از تصویر را با توجه به مقداری که برای عمق تصویر داده میشود تغییرمیدهد در بعضی موارد که به عنوان مثال عمق تصویر 0 باشد تصویر در همان حالت خود باقی میماند و درواقع کار تابع blur را انجام میدهد در پارامتر اخر میتوانید حالت border ان را تایین کنید که میتواند توسط خود نوع های شمارشی مورد استفاده قرار گیرد که جایی که فیلتر شده است خط مرزی ان رسم شود به مثال زیر دقت کنید:
#include <opencv2\opencv.hpp>
#include <Windows.h>
using namespace cv;
int main()
{
	Mat output_image;
	Mat image_read = imread("C:\\Users\\Mohamad4030\\Desktop\\0.047489001316013508_pixnaz_ir.jpg", IMREAD_COLOR);
	//bilateralFilter(image_read, output_image, 100, 300, 500);
	boxFilter(image_read, output_image, 5, Size(1, 1));
	imshow("befor", image_read);//befor Filtering
	imshow("after", output_image);//after Filtering
	ShowWindow(GetConsoleWindow(), SW_HIDE);
	waitKey(0);
}
حاصل اجرای کد بالا به صورت زیر خواهد بود:
qex9_box.jpg
تابع Laplacian: با دریافت عمق سایز پیکسل مقیاس برای روشنایی و  مقدار دلتا تصویر را به حالت های مختلف درمی اورد دقت داشته باشید برای دریافت نتیجه مطلوب باید مقیاس و دلتا هر دو مقداری داشته باشند نداشتن مقدار برای هر کدام تصویر را روشن و تیره میکند به مثال زیر دقت کنید:
#include <opencv2\opencv.hpp>
#include <Windows.h>
using namespace cv;
int main()
{
	Mat output_image;
	Mat image_read = imread("C:\\Users\\Mohamad4030\\Desktop\\c9ac_d2ynkbk.jpg", IMREAD_COLOR);
	//bilateralFilter(image_read, output_image, 100, 300, 500);
	//boxFilter(image_read, output_image, 5, Size(1, 1));
	Laplacian(image_read, output_image, 0,1,10.0,100.0);
	imshow("befor", image_read);//befor Filtering
	imshow("after", output_image);//after Filtering
	ShowWindow(GetConsoleWindow(), SW_HIDE);
	waitKey(0);
}

حاصل اجرای کد بالا به صورت زیر خواهد بود:

g384_l.jpg

با تعغیر دادن مقیاس و دلتا نتایج دیگری بدست می اید همچنین عمق و سایز پیکسل با تعغیر رو تصویر تاثیر میگذارند.
تابع medianBlur: با دریافت سایز در پارامتر سوم تصویر را بصورت خاصی کدر میکند که هرچه سایز بیشتر باشد تصویر کارتونی به نظر میرسد به مثال زیر دقت کنید:
#include <opencv2\opencv.hpp>
#include <Windows.h>
using namespace cv;
int main()
{
	Mat output_image;
	Mat image_read = imread("C:\\Users\\Mohamad4030\\Desktop\\c9ac_d2ynkbk.jpg", IMREAD_COLOR);
	//bilateralFilter(image_read, output_image, 100, 300, 500);
	//boxFilter(image_read, output_image, 5, Size(1, 1));
	medianBlur(image_read, output_image, 17);
	imshow("befor", image_read);//befor Filtering
	imshow("after", output_image);//after Filtering
	ShowWindow(GetConsoleWindow(), SW_HIDE);
	waitKey(0);
}
حاصل اجرا کد بالا بصورت زیر خواهد بود:

4e88_m.jpg

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
 توابع Image Filtering  شاید در تصویرمان بخواهیم عملیات زوم کردن را انجام دهیم در این صورت ما از توابع pyrUp،pyrDownیا تابع buildPyramid استفاده کنیمکهتابع buildPyramid تا هر چند برابر که بخواهیم تصویر را دور میکند اما بیش از حد ان باعث نابودی پیکسل های تصویر میشود.
تابع pyrUp: تصویر را نزدیک میکند(ZoomIn) این تابع الگوریتم متفاوتی دارد و باید طبق این الگوریتم پیش رفت تا مشکلی پیش نیاید الگوریتم این تابع به این صورت است که میگوید شما میخواهید تصویر را دوبرابر کنید پس باید در پارمتر سومی که سایز را از مامیخواهد سطر و ستون تصویر ضرب در2 شود اینگونه سطر و ستون دوبرابر خواهند شد و خروجی مورد نظر را میدهد اما اگر در مقداری به جز مقدار 2 ضرب یا بعلاوه شود در این صورت تصویر انقدر بزرگ میشود که امکان نمایش ان وجود ندارد  البته هر چند برای دوبرابر کردن تصویر که سایز ضرب در 2 میشود هم محدودیت وجود دارد و تا حد مشخصی میشود تصویر را نزدیک کرد بعد از ان با خطا مواجه میشویم یک مثال از این تابع را مشاهده کنید:
#include <stdio.h>
#include <stack>
using namespace cv;
Mat output_image;
Mat image_read;
void Zoom_In()
{
	pyrUp(image_read, output_image, Size(image_read.cols * 2, image_read.rows * 2));
	imshow("Zoom In", output_image);
	image_read = output_image;
}
void Zoom_Out()
{
	pyrDown(image_read, output_image, Size(image_read.cols / 2, image_read.rows / 2));
	imshow("Zoom Out", output_image);
	image_read = output_image;
}
void ZoomIn_And_ZoomOut(int position, void* user)
{
	std::cout << "Position: " << position << " " << " user data " <<(int)user<< std::endl;
}
int main()
{
	void* userdata = (void*)10;
	TrackbarCallback zoom_in = (TrackbarCallback)Zoom_In;
	TrackbarCallback zoom_out = (TrackbarCallback)Zoom_Out;
	image_read = imread("C:\\Users\\Mohamad4030\\Desktop\\c9ac_d2ynkbk.jpg", IMREAD_COLOR);
	imshow("befor",image_read);//befor filtering
	ShowWindow(GetConsoleWindow(), SW_HIDE);
	createTrackbar("TrackBar1", "befor", 0, 10,zoom_in);
	waitKey(0);
}
 تابع createTrackBar: یک اسلایدربار را به یک پنجره متصل میکند ورودی اول نام اسلایدر بار ورودی دوم نام پنجره برای متصل شدن ورودی سوم حداقل مقدار اسلایدربار ورودی چهارم حداکثر مقدار ورودی پنجم یک رویداد برای اینکه اگر موقعیت اسلایدربار تعغیر کرد چه کاری صورت گیرد که اینجا ما میتوانیم به دو صورت این ورودی را بدهیم با موقعیت و دیتاهای کاربر که باید بصورت اشارگر باشد و در خود تابع به نوع مناسب تبدیل شود یا اینکه یک TrackbarCallback تعریف کرده همونطور که در کد میبینید و تابع را نوشته و تبدیل میکنیم که تابع ما ZoomIn است ورودی اخر این تابع دیتای های کاربر هست که به پارامتر void* user منتقل میشود در تابع ZoomIn دقت کنید که باید بعد از عملیات زوم image_read برابر با output_image قرار بگیرد تا در عملیات بعد سایز image_read که در پارامتر سوم مورد نیاز است برای زوم بعدی مورد استفاده قرار گیرد.
حاصل اجرای کد بالا بصورت زیر خواهد بود:

bn2u_zoomin.jpg

تابع pyrDown: برای بتوانیم تصویر رادور کنیم(ZoomOut) از این تابع استفاده میکنیم برای اینکه از سطر و ستون تصویر بکاهیم و تصویر را تا اندازه ی مشخص دور کنیم باید اینجا سطر و ستون تقسیم بر 2 شود که اگر به عنوان مثال ضرب در 2 شود تصویر نزدیک میشود در همان حالت اگر تصویر تقسیم بر 2 شود به حالت اولیه خود برمیگردد یک مثال از این تابع را مشاهده کنید:

#include <opencv2\opencv.hpp>
#include <Windows.h>
#include <iostream>
#include <stdio.h>
#include <stack>
using namespace cv;
Mat output_image;
Mat image_read;
void Zoom_In()
{
	pyrUp(image_read, output_image, Size(image_read.cols * 2, image_read.rows * 2));
	imshow("Zoom In", output_image);
	image_read = output_image;
}
void Zoom_Out()
{
	pyrDown(image_read, output_image, Size(image_read.cols / 2, image_read.rows / 2));
	imshow("Zoom Out", output_image);
	image_read = output_image;
}
void ZoomIn_And_ZoomOut(int position, void* user)
{
	std::cout << "Position: " << position << " " << " user data " <<(int)user<< std::endl;
}
int main()
{
	void* userdata = (void*)10;
	TrackbarCallback zoom_in = (TrackbarCallback)Zoom_In;
	TrackbarCallback zoom_out = (TrackbarCallback)Zoom_Out;
	image_read = imread("C:\\Users\\Mohamad4030\\Desktop\\c9ac_d2ynkbk.jpg", IMREAD_COLOR);
	imshow("befor",image_read);//befor filtering
	ShowWindow(GetConsoleWindow(), SW_HIDE);
	createTrackbar("TrackBar1", "befor", 0, 10,zoom_in);
	createTrackbar("TracBar2", "befor", 0, 10, zoom_out);
	waitKey(0);
}

حاصل اجرای کد بالا بصورت زیر خواهد بود:

8kst_in_out.jpg

تابع buildPyramid: کار تابع pyrDown راانجام میدهد این کار توسط پارامتر سوم صورت میگیرد فقط تنها نکته ای که وجود دارد پارامتر دوم این تابع یک InputOutputOfArray که منظورش یک ورودی و خروجی از ارایه است دریافت می کند یعنی باید یک ارایه ای دریافت کند که ورودی و خروجی ان فقط از همان ارایه باشد در دو تابع ذکر شده ما امدیم وبعد از عملیات  تصویر اصلی را برابر تصویر که عملیات روی ان صورت گرفته قرار میدادیم تا در عملیات بعدی نتیجه مطلوب را دریافت کنیم اما در اینجا فقط با دادن مقداری که میخواهیم عملیات ZoomOut را انجام دهیم تصویر را دور میکند یک مثال از این تابع مشاهده کنید:
#include <opencv2\opencv.hpp>
#include <Windows.h>
#include <iostream>
#include <stdio.h>
#include <stack>
using namespace cv;
Mat output_image;
Mat image_read;
/*void Zoom_In()
{
	pyrUp(image_read, output_image, Size(image_read.cols * 2, image_read.rows * 2));
	imshow("Zoom In", output_image);
	image_read = output_image;
}
void Zoom_Out()
{
	pyrDown(image_read, output_image, Size(image_read.cols / 2, image_read.rows / 2));
	imshow("Zoom Out", output_image);
	image_read = output_image;
}
void ZoomIn_And_ZoomOut(int position, void* user)
{
	std::cout << "Position: " << position << " " << " user data " <<(int)user<< std::endl;
}*/
int main()
{
	vector<Mat> vecmat;
	image_read = imread("C:\\Users\\Mohamad4030\\Desktop\\c9ac_d2ynkbk.jpg", IMREAD_COLOR);
	buildPyramid(image_read, vecmat,4);
	for (int i = 0; i < vecmat.size(); i++)
	imshow("ZoomIn"+i, vecmat[i]);
	ShowWindow(GetConsoleWindow(), SW_HIDE);
	waitKey(0);
}

دقت کنید که کلاس vector از خود کتابخانه ی OpenCV است و باید از همین کلاس برای این تابع استفاده کنید جز این با خطا مواجه میشوید.

حاصل اجرای کد بالا بصورت زیر است:

s31_%D8%B0%D8%B0%D8%B0.jpg

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از ۷۵ اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به عنوان یک لینک به جای

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • جدید...