در این قسمت تیم کدگیت را با آموزش تبدیل تصویر رنگی به خاکستری در جاوا با OpenCV همراهی کنید. ابتدای این جلسه مروری بر کتابخانه OpenCV و کلاس Mat داشته و سپس کد تبدیل رنگی به خاکستری را به کمک این کتابخانه در جاوا پیاده سازی میکنیم. پیشنهاد میکنیم برای یادگیری بهتر این جلسه، آموزشهای زیر را مطالعه نمایید:
کتابخانه OpenCV
OpenCV یا همان Open Computer Vision مجموعه ای از کتابخانههای برنامهنویسی پردازش تصویر و یادگیری ماشین است. این کتابخانه با داشتن توابع مختلف در زمینه پردازش تصویر، فرآیندهای کار بر روی تصاویر را بسیار آسان نموده است.برای پیاده سازی کد این جلسه از کتابخانه opencv استفاده خواهیم کرد. برای استفاده از این کتابخانه ابتدا باید آن را فراخوانی کرد. کد زیر بارگذاری کتابخانه opencv در جاوا میباشد:
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
کلاس Mat
کلاس Mat برای ذخیره سازی و نگهداری مقادیر یک تصویر تک و یا چند کاناله (تصاویر grayscale تک کاناله و تصاویر رنگی چند کاناله هستند) استفاده میشود. این کلاس نمایشی از آرایه n بعدی است که میتوان برای ذخیره تصاویر، ماتریس و … نیز از آن استفاده کرد. در کد زیر با استفاده از کلاس Mat یک ماتریس با ابعاد 3*3 ایجاد کردیم(cv_type برای depth و کانال تصویر استفاده می شود و در مثال زیر تک کانال استفاده شده است):
Mat mat = Mat.zeros(3, 3, CvType.CV_8UC1);
برای چاپ ماتریس بالا میتوان از متد dump استفاده کرد:
System.out.println("mat = " + mat.dump());
خروجی کد به صورت زیر است:
mat = [ 0, 0, 0;
0, 0, 0;
0, 0, 0]
تبدیل تصویر رنگی به خاکستری در جاوا با OpenCV
تصویر ورودی برای تبدیل RGB به GrayScale به صورت زیر است:

برای تبدیل تصویر رنگی به خاکستری در جاوا ابتدا یک تصویر را میخوانیم:
Mat input = Imgcodecs.imread("baboon.png");
در ادامه باید تصویر خروجی را ایجاد کنیم. برای این کار از Mat استفاده میکنیم:
Mat gray = new Mat();
در کلاس Imgproc متدی با نام cvtColor وجود دارد. این متد برای تبدیل فضای رنگی تصاویر استفاده میشود(مانند تبدیل تصاویر رنگی به خاکستری یا تبدیل تصاویر رنگی به HSV و …). حال با استفاده از کلاس Imgproc و متد cvtColor تبدیل را انجام میدهیم. متد cvtColor سه پارامتر تصویر ورودی، تصویر خروجی و نوع تبدیل را در ورودی میگیرد.
Imgproc.cvtColor(input, gray, Imgproc.COLOR_RGB2GRAY);
حال نوبت به نمایش تصویر است:
HighGui.imshow("Gray baboon", gray);
HighGui.imshow("Gray input baboon", grayinput);
HighGui.waitKey(0);
خروجی کد بالا به صورت زیر است:

تبدیل تصویر رنگی به خاکستری به کمک Imgcodecs
در صورتی که نیاز باشد تصویر به صورت خاکستری خوانده شود میتوان از کلاس Imgcodecs استفاده کرد. کد زیر تصویر baboon.png را به صورت خاکستری خوانده و آن را در متغیر از کلاس Mat میریزد:
Mat grayinput = Imgcodecs.imread
("baboon.png",Imgcodecs.IMREAD_GRAYSCALE);