در این قسمت تیم کدگیت را با آموزش Kernel در جاوا (پرازش تصویر) همراهی کنید. در ادامه آموزشهای پردازش تصویر در جاوا امروز در خصوص Kernel و کاربردهای آن صحبت خواهیم کرد. همچنین در پایان با استفاده از کتابخانه OpenCV به پیادهسازی یک Kernel خواهیم پرداخت. پیشنیازهای این آموزش شامل موارد زیر است:
- نصب OpenCV در جاوا
- خواندن تصاویر در جاوا با OpenCV
- نوشتن تصاویر در جاوا با OpenCV
- رسم اشکال هندسی در جاوا با OpenCV
- تبدیل تصویر رنگی به خاکستری در جاوا با OpenCV
Kernel چیست؟
Kernel (هسته) در پردازش تصویر (یا بینایی مایشن) ماتریسی هستند که بر روی آنها عملیات convolution انجام میگردد. convolution با عملیات ضرب، دو آرایه را با هم ادغام میکند. در پردازش تصویر convolution با عبور از هر پیکسل، عملیاتی بر روی آن پیکسل و همسایگان آن انجام میدهد (کمی گیج کننده شد!).
در تصویر زیر یک ماتریس Kernel آوردهایم که سایز آن 3*3 میباشد.

عملیات convolution
ما یک Kernel داریم که میخواهیم عملیات convolution انجام دهیم. عدد وسط ماتریس Kernel را بر روی پیکسلهای تصویر قرار داده و بر روی پیکسلها حرک میکنیم. حرکت بر روی پیکسلها به صورت زیر میباشد:

مراحل زیر را برای انجام دادن عملیات convolution انجام میدهیم:
- بر روی تمامی پیکسلهای تصویر با استفاده از ماتریس Kernel یک بار چرخش انجام میدهیم.
- درایههای ماتریس Kernel و پیکسلهای تصویر را به صورت نظیر به نظیر با هم ضرب میکنیم.
- حاصلضربهای مرحله قبل را با هم جمع میکنیم.
- مقدار بدست آمده، حاصل خانه وسط پیکسل تصویر است.
- مراحل بالا را برای تمامی پیکسلها انجام میدهیم.

Kernel در جاوا
برای پیاده سازی kernel در جاوا از کلاس Mat برای ایجاد Kernel و از کلاس Imgproc متد filter2D برای انجام عملیات فیلتر بر روی تصویر استفاده خواهیم کرد. این متد یک Kernel را به عنوان ورودی میگیرد و بر روی آن عملیات convolution انجام میدهد. برای پیاده سازی ابتدا یک Kernel ایجاد میکنیم:
Mat kernel = new Mat();
Mat ones = Mat.ones(3, 3, CvType.CV_32F);
Core.multiply(ones, new Scalar(1 / (double) (9)), kernel);
در کد بالا تمامی درایههای ماتریس Kernel برابر با 1/9 میباشد. حال تصویر Baboon.png را میخوانیم:
Mat input = Imgcodecs.imread("baboon.png");
در ادامه با استفاده از متد filter2D فیلتر دلخواه خود را پیاده سازی میکنیم:
Mat filterOutput = new Mat();
Imgproc.filter2D(input, filterOutput, -1, kernel);
ورودیهای متد filter2D به ترتیب تصویر ورودی، تصویر خروجی، عمق تصویر (برابر با عمق تصویر ورودی قرار داده شده است) و ماتریس Kernel میباشد. خروجی تصویر ما به صورت زیر است:

تصویر ورودی نیز به صورت زیر است:
