طرق تطبيق تأثير Gaussian Blur دون تغيير البكسلات الأصلية
في عالم معالجة الصور، يُعتبر تأثير حقل الغاوسي (Gaussian blur) من التقنيات الشائعة المستخدمة لتنعيم الصور وتقليل التفاصيل. لكن هناك تساؤل يتبادر إلى الذهن: كيف يمكن تطبيق هذا التمويه دون تعديل البكسلات الأصلية للصورة؟ سنستعرض في هذه المقالة كيفية تنفيذ تأثير التمويه الغاوسي مع الحفاظ على النقاء الأصلي للصورة باستخدام تقنيات معالجة معينة.
ما هو تأثير حقل الغاوسي؟
تأثير حقل الغاوسي هو فلتر يُستخدم لتنعيم الصور عن طريق تقليل تفاصيلها بنعومة. يعتمد هذا التأثير على دالة الغاوس، التي تُعتبر دالة احتمالية تُستخدم لتمثيل البيانات التي تتبع توزيع الغاوس. عند تطبيق هذا الفلتر، يتم حساب وزن كل بكسل في الصورة بناءً على المسافة من مركزه، مما يعطي تأثيراً مرنًا وناعماً.
كيفية التطبيق بدون تعديل البكسلات الأصلية
لتطبيق تأثير التمويه الغاوسي دون التلاعب بالبكسلات الأصلية، نقوم بإنشاء قناع يُستخدم لتحديد كيفية تمويه الصورة. في هذه الطريقة، نبدأ أولاً بتحديد نسبة التمويه التي نرغب فيها.
-
إنشاء قناع تمويه:
علينا أولاً إنشاء قناع تمويه بتوزيع غاوسي. يتم ذلك باستخدام التوزيع الغاوسي كالتالي:- نحدد نصف قطر التمويه (radius) الذي نريد تطبيقه.
- نقوم بحساب مركز التوزيع الغاوسي، حيث يكون ارتفاعه عند المركز ويقل كلما ابتعدنا عنه.
-
توسيع القناع:
قبل تطبيق الفلتر، نحتاج إلى توسيع القناع ليشمل البكسلات المجاورة. يُفضل استخدام خوارزمية مثلmax_pool2d
في مكتبة Torch، والتي تسمح لنا بتوسيع القناع عن طريق تكرار الحواف. -
تطبيق التمويه:
بعد توسيع القناع، نُطبق الفلتر الغاوسي باستخدام عملية الالتفاف (convolution). حيث نستخدم نواة غاوسية لنمذجة تأثير التمويه على القناع. هذا يتيح أن تكون هناك درجات من التمويه بناءً على المسافة من مركز القناع. - إرجاع النتيجة:
بعد تطبيق الفلتر، يتم اقتصاص الصورة الناتجة إلى حجم الصورة الأصلية، مما يضمن عدم تعديل البكسلات الأساسية الأصلية.
الكود البرمجي لتنفيذ التمويه الغاوسي
إليكم مثال لكود بايثون يوضح كيفية تطبيق التمويه الغاوسي دون تعديل البكسلات الأصلية:
def run(self, *, Mask: torch.Tensor, radius: int):
assert Mask.ndim == 3, "القناع المتوقع أن يكون له شكل [B,H,W]"
assert radius > 0, "يجب أن يكون نصف القطر موجبًا"
# تحديد حجم النواة
kernel_size = 2 * radius + 1
# إنشاء نواة غوسية مستديرة
y, x = torch.meshgrid(
torch.arange(-radius, radius + 1, device=Mask.device),
torch.arange(-radius, radius + 1, device=Mask.device),
indexing="ij"
)
distance = torch.sqrt(x ** 2 + y ** 2)
gaussian_kernel = torch.exp(-0.5 * (distance / radius) ** 2)
gaussian_kernel /= gaussian_kernel.sum()
gaussian_kernel = gaussian_kernel.view(1, 1, kernel_size, kernel_size)
# توسيع القناع
Padded_mask = F.pad(Mask, (radius, radius, radius, radius), mode="replicate")
# تطبيق الحد الأقصى للتجميع
dilated_mask = F.max_pool2d(Padded_mask.unsqueeze(1), kernel_size, stride=1, padding=radius, ceil_mode=True)
# تطبيق التمويه
blurred_mask = F.conv2d(dilated_mask, gaussian_kernel, padding=0)
# الاقتصاص
blurred_mask = blurred_mask.squeeze(1)
return self.output({"blurred_mask": blurred_mask})
خاتمة
باستخدام هذه الخطوات والكود البرمجي المذكور، يمكن تحقيق تأثير حقل الغاوسي بكفاءة وبدون إجراء أي تعديلات على البكسلات الأصلية للصورة. يُعتبر هذا النهج مفيدًا في تطبيقات عديدة، بما في ذلك الرسوميات الحاسوبية وتحرير الصور، حيث تحتاج إلى الحفاظ على البيانات الأصلية مع إجراء تعديلات لتحسين المظهر العام. في النهاية، تُظهر هذه الطريقة كيف يمكن دمج الرياضيات مع فن معالجة الصور لتحقيق نتائج مذهلة.