فیلتر میانه

**فیلتر میانه** یکی از فیلترهای غیرخطی در فیلتر دیجیتال است. از این فیلتر برای گرفتن نویز تصاویر و سیگنال‌ها استفاده می‌شود. نویزگیری تصاویر معمولاً پیش‌زمینه‌ای برای دیگر تغییرات و شناسایی‌ها بر روی تصاویر است. مثلاً برای تشخیص گوشه ابتدا باید با استفاده از یکی از فیلترها مانند فیلتر میانه نویز تصویر را گرفت. فیلتر میانه به‌طور گسترده‌ای در پردازش تصویر کاربرد دارد. همچنین نمی‌توان از کاربرد فیلتر میانه در پردازش سیگنال چشم پوشید. در کاربردهای خاص‌تر فیلتر میانه در سیستم‌های رادیوگرافی، سیستم‌های گرفتن نوار مغزی یا EEG و دستگاه‌های ثبت فشار خون استفاده می‌شود.
بندانگشتی|اعمال فیلتر میانه بر روی یک عکس با شعاع‌های ۱۰، ۲۰، ۳۰ و ۴۰ پیکسل.

## توضیح الگوریتم
الگوریتم کلی فیلتر میانه با پیدا کردن میانه و جایگزینی آن در مجموعه ورودی کار می‌کند (میانهٔ یک بردار عنصر میانی برای یک بردار فردعضوی یا میانگین دو عنصر میانی برای یک بردار زوج‌عضوی تعریف می‌شود) به عنوان مثال اگر وروی یک بردار با طول k و فرد باشد فیلتر عنصر میانی را که عنصر با اندیس (\frac{k + 1}{2})آن است را به عنوان میانه آن بردار اعلام می‌کند، در پردازش تصویر معمولاً ورودی یک ماتریس است و برای زیرماتریس‌های کوچک‌تر با اندازه k * kعنصر مرکزی ماتریس با میانه تمامی عنصرهای در زیرماتریس جایگزین می‌شود. (در صورتی که kفرد باشد عنصر مرکزین میانه است اما در صورتی که kزوج باشد باید میانگین چهار عنصر مرکزین را به دست آورد)؛ امکان استفاده از فیلتر میانه برای ابعاد بالاتر نیز وجود دارد، دربارهٔ تحلیل زمانی الگوریتم می‌توان گفت که پیچیدگی زمانی الگوریتم با توجه به نحوه پیاده‌سازی الگوریتم متفاوت است، در فضای یک‌بعدی پیدا کردن میانه را می‌توان در زمان خطی انجام داد.

## فیلتر میانه در فضای یک‌بعدی
در حالتی که ورودی یک بردار یا فضای یک‌بعدی باشد باید به جای هر k عنصر متوالی میانه آن را جایگزین کنیم؛ به عنوان مثال الگوریتم فیلتر میانه با k = 3 را برای یک بردار ورودی x را اعمال می‌کنیم، برای اجرای فیلتر میانه باید  \left\vert x \right\vert >= k باشد. در مثال زیر \left\vert x \right\vert = 4 است.

x =\{ 2 , 3, 80 , 6\} 

y1 = med(2, 3, 80) = 3 

y2 = med(3, 80, 6) = med(3, 6, 80) = 6 

y3 = med(80, 6, 2) = med(2, 6, 80) = 6 

y4 = med(6, 2, 3) = med(2, 3, 6) = 3 

\Rightarrow y = \{3, 6, 6, 3\} 

### تابع غیرخطی فیلتر میانه در حالت کلی
در حالت کلی می‌توان تابع غیرخطی فیلتر میانه را این‌گونه نوشت:

y(n) = med[x(n - k) , x(n - k + 1) ,..., x(n) , ... , x( n + k - 1 ) , x(n + k)]

### تبدیل محاسبه فیلتر میانه به مجموع میانه‌های دودویی
بندانگشتی|اعمال فیلتر میانه دودویی بر یک بردار با <math>k = 3</math>

تحلیل و محاسبه تابع فیلتر میانه با توجه به مقادیر موجود در سیگنال ورودی می‌تواند سخت و هزینه‌بر باشد و در صورتی که بخواهیم تأثیرگذاری چند فیلتر غیرخطی را بر یکدیگر تحلیل کنیم این فرایند سخت‌تر هم می‌شود، از این رو گاهی برای محاسبه تابع غیرخطی فیلتر میانه آن را به چند فیلتر خطی دودویی تبدیل می‌کنند و سپس جمع ایشان را پیدا می‌کنند. برای انجام این کار می‌توان از الگوریتم تجزیه Threshold استفاده کرد. دقت کنید که مزیت اصلی این کار این است که می‌توان میانه بردار دودویی را راحت‌تر از حالت عادی محاسبه کرد، به عنوان مثال میانهٔ بردار دودویی با طول ۳ به شکل زیر قابل محاسبه است.y(n) = x(n - 1) \cap x(n) \cup x(n - 1) \cap x(n + 1) \cup x(n) \cap x(n + 1) باید توجه داشت که عملیات بیتی در سیستم‌های کامپیوتری راحت‌تر و سریع‌تر از جمع اعداد اتفاق می‌افتد.

## فیلتر میانه در فضای دوبعدی
برای محاسبه فیلتر میانه در فضای دوبعدی عنصر مرکزین هر زیرماتریس با میانه تمام عناصر اطراف به شعاع k جایگزین می‌شود. شبه‌کد زیر عملکرد این الگوریتم نوشته شده‌است. بندانگشتی|اعمال فیلتر میانه بر یک ماتریس دوبعدی
```text
allocate outputPixelValue[image width][image height]
   allocate window[window width * window height]
   edgex := (window width / 2) rounded down
   edgey := (window height / 2) rounded down
   for x from edgex to image width - edgex
       for y from edgey to image height - edgey
           i = 0
           for fx from 0 to window width
               for fy from 0 to window height
                   window[i] := inputPixelValue[x + fx - edgex][y + fy - edgey]
                   i := i + 1
           sort entries in window[]
           outputPixelValue[x][y] := window[window width * window height / 2]
```


دقت کنید که این الگوریتم برای پردازش فیلتر میانه برای تصاویر با یک کانال رنگی نوشته شده‌است؛ به عنوان مثال در تصاویری که از مدل رنگی RGB استفاده می‌کنند باید الگوریتم فوق سه بار برای هر سه کانال رنگی اجرا شود، همچنین این الگوریتم مرزهای عکس را در فیلتر لحاظ نمی‌کند. یعنی مقادیر مرزی ماتریس (سطر و ستون اول و آخر) تغییر نمی‌کنند.

## کاربرد فیلتر میانه در پردازش تصویر
[بندانگشتی|گرفتن نویزهای ضربه‌ای و رفع[:en:Defective_pixel|پیکسل‌های ناقص با فیلتر میانه]]
همان‌طور که در مقدمه گفته شد معمولاً فیلتر میانه برای پیش‌زمینه اصلی برای پردازش تصویر را فراهم می‌کند، کاربرد اصلی فیلتر میانه یک‌دست‌سازی تصویر و گرفتن نویزهای ضربه‌ای یا impulse noise است. جایگزین کردن میانه در هر پنجره عکس باعث می‌شود تا مقادیری که از میانه دورترند حذف شوند و عکس به چیزی که بیشتر در آن تکرار شده شبیه می‌شود، می‌توان گفت که فیلتر میانه به بلوری شدن عکس کمک می‌کند و جزئیات را از بین می‌برد.

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

## الگوریتم‌های مشابه
الگوریتم‌های دیگری نیز برای گرفتن نویز تصاویر وجود دارند که در ادامه تعدادی از آن‌ها آمده‌اند.
* فیلتر گاوسی
* یک‌دست‌سازی Lulu
* فیلتر دوطرفه

## مقاله‌های مشابه
* پردازش سیگنال
* میانه (آمار)
* میانه میانه‌ها
* پردازش تصویر

## جستارهای وابسته
* فیلتر میانه
* الگوریتم پیدا کردن میانه
* نویز ضربه‌ای
* فیلتر میانه وزن‌دار
* مقدمه‌ای بر فیلتر میانه وزن‌دار

## منابع

رده:پردازش سیگنال
رده:فنون کاهش نویز تصویر