هسته (پردازش تصویر)

در پردازش تصویر، یک **هسته**, **ماتریس کانولوشن**, یا **پوشش** یک ماتریس کوچک است که روی تصویر اعمال می‌شود.
(تصویر، یک ماتریس است که در هریک از درایه‌های آن مقادیر رنگ مربوط به آن درایه بسته به سیستم رنگی استفاده شده، قرارگرفته اند). هسته یا کرنال، یک ماتریس 3\times3 است که با ضرب هر آرایه آن در آرایه معادل‌اش در هر بلوک 3\times3 از تصویر اصلی، عددی حاصل می‌شود که در تصویر نهایی جایگزین 9 پیکسل تصویر اصلی است.

از هسته برای ایجاد فیلترهای مختلف روی عکس استفاده می‌کنند، از دیگر کاربردهای آن در یادگیری ماشین است.
هر هسته برای یک کار خاص مفید است مثل مات کردن، تیز کردن، برجسته سازی، تشخیص لبه، و کارهای دیگر.

این تغییرات روی تصویر با عبور دادن ماتریس هسته (که از ماتریس تصویر اندازهٔ کوچکتری دارد) از تصویر یا میانگین‌گیری کانولوشن بین هسته و تصویر صورت می‌گیرد.

## جزئیات
بسته به مقادیر عنصر، یک هسته می‌تواند محدوده گسترده‌ای از تأثیرات را داشته باشد.

در بالا تنها مثال‌های کمی از تأثیراتی که با استفاده از کانولوشن بین کرنل‌ها و تصاویر قابل انجام است نمایش داده شده‌است.

### منشأ
منشأ موقعیت یک خانه از هسته است که بالاتر از پیکسل خروجی فعلی است.
منشأ می‌تواند خارج از هسته باشد، اگرچه معمولاً یکی از عناصر هسته است.

در مورد هستهٔ متقارن منشأ معمولاً عنصر مرکزی است، در این صورت هسته باید ماتریسی فرد-فرد باشد.

## کانولوشن
کانولوشن عمل اضافه کردن هر خانه (پیکسل) از عکس به خانه‌های اطرافش (پیکسل‌های همسایهٔ محلی) است که توسط هسته وزن دهی شده‌اند.

این عمل مربوط به حالتی از کانولوشن در ریاضیات است.

باید به این نکته توجه شود که عمل ضرب ماتریس‌ها که در کانولوشن انجام می‌شود همان عمل ضرب تعریف شده روی ماتریس‌ها نیست، گرچه مشابهاْ آن را با * نشان می‌دهیم.

برای مثال، فرض کنید دو ماتریس ۳ – مربعی K و M را داشته باشیم که K ماتریس هسته و M قسمتی از تصویر مورد نظر ما باشد، کانولوشن، عملیات وارون کردن ماتریس هسته به صورت افقی و عمودی و سپس ضرب نظیر به نظیر درایه‌های دو ماتریس و در نهایت جمع همهٔ آنهاست.
البته اگر ماتریس هسته متقارن باشد نیازی به وارون کردن افقی و عمودی ماتریس نیست زیرا در این حالت هستهٔ وارون شده با هستهٔ اصلی برابر است.

ماتریس‌های K و M را به شکل زیر داریم:


K =
\begin{bmatrix}
a & b & c \\
d & e & f \\
g & h & i \\
\end{bmatrix}
,
M =
\begin{bmatrix}
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{bmatrix}


ماتریس K را به صورت عمودی و افقی وارون می‌کنیم، هستهٔ جدید به شکل روبروست:


K =
\begin{bmatrix}
i & h & g \\
f & e & d \\
c & b & a \\
\end{bmatrix}


گام بعدی ضرب نظیر به نظیر درایه‌های دو ماتریس و جمع همهٔ آنهاست:


K * M =
\Biggl(

\begin{bmatrix}
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{bmatrix}
*\begin{bmatrix}
i & h & g \\
f & e & d \\
c & b & a \\
\end{bmatrix}
\Biggl)


عنصر قرار گرفته در مختصات (۲٬۲) از تصویر حاصل (یعنی عنصر مرکزی)، یک ترکیب وزن دار از تمام درایه‌های ماتریس تصویر است، که توسط هسته وزن دهی شده‌اند:


[2,2] = (i.1) + (h.2) + (g.3) + (f.4) + (e.5) + (d.6) + (c.7) + (b.8) + (a.9)


درایه‌های دیگر هم به‌طور مشابه مقدار دهی می‌شوند، به این صورت که مرکز هسته را روی نقاط مرزی تصویر قرار می‌دهیم و یک حاصل جمع وزن دار را محاسبه می‌کنیم.

مقادیر یک پیکسل داده شده از تصویر حاصل، با ضرب هر مقدار از ماتریس هسته در مقادیر پیکسل‌های متناظر آن در ماتریس تصویر اولیه محاسبه می‌شوند.

این عمل می‌تواند توسط شبه کد زیر به صورت یک الگوریتم نشان داده شود:


```text
for each image row in input image:
   for each pixel in image row:

      set accumulator to zero

      for each kernel row in kernel:
         for each element in kernel row:

            if element position  corresponding* to pixel position then
               multiply element value  corresponding* to pixel value
               add result to accumulator
            endif

      set output image pixel to accumulator
```


بندانگشتی|150px|کانولوشن بین هسته و تصویر توسط کرنل تیزکردن

: پیکسل‌های متناظر در تصویر نسبت به منشأ ماتریس هسته یافته می‌شوند.

اگر هسته متقارن بود منشأ هسته را روی پیکسل فعلی قرار دهید، بنابراین هسته توسط پیکسل‌های مجاور هم پوشانی خواهد داشت.
حال هر یک از عناصر هسته را با پیکسلی از تصویر که متناظر ان است ضرب کرده و همهٔ مقادیر بدست آمده را باهم جمع کنید.

اگر هسته متقارن نباشد باید قبل از محاسبهٔ کانولوشن همانند قسمت بالا، ماتریس هسته به صورت افقی و عمودی برعکس شود.

### مدیریت حاشیهٔ تصویر
در انجام کانولوشن روی تصویر ممکن است گاهی به پیکسل‌هایی در خارج از مرز تصویر نیاز داشته باشیم؛ بنابراین، دو راه برای مدیریت حاشیهٔ تصاویر داریم:

#### کانولوشن بدون حاشیه گذاری
بندانگشتی|150px|کانولوشن بدون حاشیه گذاری
از هر پیکسلی در تصویر حاصل که نیاز به مقادیری در بیرون از حاشیه‌ها داشته باشد صرف نظر می‌شود، در واقع عبور هسته از تصویر به صورتی خواهد بود که درایهٔ اول ماتریس هسته در موقعیت (۱٬۱) بر روی درایهٔ اول ماتریس تصویر بیافتد و هسته از تصویر بیرون نزند.
این روش می‌تواند باعث شود که تصویر خروجی کمی کوچکتر شود و لبه‌های آن بریده شوند.

#### کانولوشن با حاشیه گذاری
بندانگشتی|150px|کانولوشن با حاشیه گذاری
در این روش هسته را به صورتی از ماتریس تصویر عبور می‌دهیم که درایهٔ مرکزی هسته (منشأ) بر روی درایهٔ اول ماتریس تصویر بیافتد.
در این حالت هسته می‌تواند از ماتریس تصویر بیرون بزند که مقادیر خارج از تصویر می‌توانند به انواع زیر مدیریت بشوند:
* **پوشش با صفر (zero padding):**
مقادیر خارج از تصویر در این حالت برابر با صفر قرار داده می‌شوند.
می‌توانیم در این روش به جای صفر از هر مقدار ثابت و دلخواه دیگر هم استفاده کنیم.
* **گسترش :**
نزدیک‌ترین پیکسل‌ها به لبه‌های تصویر به اندازهٔ لازم گسترش داده می‌شوند تا مقادیر مورد نیاز برای کانولوشن را فراهم کنند.
پیکسل‌های کنج را در ابعاد یک گوهٔ ۹۰ درجه گسترش می‌دهیم، بقیهٔ پیکسل‌ها به صورت خطی گسترش داده می‌شوند.
در این روش در واقع حاشیه‌های تصویر را تکرار می‌کنیم.
* **گسترش آینه وار :**
تصویر در حاشیه‌هایش اینه وار منعکس می‌شود. برای مثال، بجای خواندن پیکسلی که سه واحد خارج از لبه است پیکسلی که سه واحد داخل لبه است خوانده می‌شود
* **پوشانیدن :**
تصویر در واقع پوشانده می‌شود (تکرار تصویر به صورت یکپارچه و بدون مرز) و برای این کار از مقادیری که در حاشیه یا کنج مخالف هستند استفاده می‌شود.
در این روش دور تصویر اصلی را با تکرار خود تصویر پر می‌کنیم.

نمونه‌هایی از انواع کانولوشن با حاشیه گذاری:

### نرمال سازی
نرمال سازی به عنوان تقسیم هر عنصر در هسته بر جمع همهٔ عناصر هسته تعریف می‌شود که در نتیجه، جمع عناصر یک هستهٔ نرمال شده برابر با یک می‌شود، این کار باعث می‌شود که روشنایی تصویراصلاح شده به اندازه روشنایی تصویر اصلی باشد.

برای مثال ماتریس هستهٔ استفاده شده در Box Blur را در نظر بگیرید:


K =
\begin{bmatrix}
1 & 1 & 1 \\
1 & 1 & 1 \\
1 & 1 & 1 \\
\end{bmatrix}


اگر همهٔ عناصر آن را جمع کنیم عدد ۹ بدست می‌آید، بنابراین هسته نرمال شده نیست و برای اصلاح آن باید همهٔ درایه‌های ماتریس را بر ۹ تقسیم کرد:


K_n =
\begin{bmatrix}
\frac{1}{9} & \frac{1}{9} & \frac{1}{9}  \\
\frac{1}{9} & \frac{1}{9} & \frac{1}{9} \\
\frac{1}{9} & \frac{1}{9} & \frac{1}{9} \\
\end{bmatrix}
=
\frac{1}{9}
\begin{bmatrix}
1 & 1 & 1 \\
1 & 1 & 1 \\
1 & 1 & 1 \\
\end{bmatrix}


حال جمع عناصر برابر ۱ می‌شود پس ماتریس هسته نرمال شده‌است.

## منابع

* Ludwig, Jamie (n.d.), "Image Convolution". Portland State University. http://web.pdx.edu/~jduh/courses/Archive/geog481w07/Students/Ludwig_ImageConvolution.pdf
* Lecarme, Olivier; Delvare, Karine (ژانویه ۲۰۱۳). *The Book of GIMP: A Complete Guide to Nearly Everything*. No Starch Press, p. 429, .
* Gumster, Jason van; Shimonski, Robert (مارس ۲۰۱۲). *GIMP Bible*. Wiley, pp. 438–442, .
* Stockman, George C. ; Shapiro, Linda G. (فوریه ۲۰۰۱). *Computer Vision*. Prentice Hall, pp. 53–54, .

رده:پردازش تصویر
رده:کشف ویژگی‌ها