অধ্যায়Phase 2 · কোর ইমেজ প্রসেসিং
2.3 16 মিনিট পড়া

Filtering ও Smoothing

Convolution-এর গণিত।

🎬 গল্প দিয়ে শুরু
Photoshop-এর “Sharpen”, ক্যামেরার “Portrait blur”, এমনকি CNN-এর প্রথম layer — সব কিছুর হৃদয়ে একটিই গাণিতিক ক্রিয়া: Convolution। এটি বুঝে ফেললে Image Processing-এর ৬০% আপনার আয়ত্তে।

Convolution — গাণিতিক সংজ্ঞা

একটি ছোট matrix (kernel/filter) ছবির উপর slide করানো হয়। প্রতি অবস্থানে kernel-এর প্রতিটি element-কে নিচের pixel-এর সাথে গুণ করে যোগ করা হয় — ফলাফল output ছবির ঐ pixel।

text
3x3 kernel applied at pixel (i,j)
output[i,j] = Σ  kernel[u,v] * image[i+u, j+v]
              u,v
এক pixel-এর জন্য 9 multiplication + 8 addition।
একটি 1080p ছবি = 2 million pixel × 9 = ~18M ops প্রতি filter।

Smoothing — Averaging Kernel

python
import cv2, numpy as np

img = cv2.imread("noisy.jpg")

# 5x5 box / average kernel
kernel = np.ones((5,5), np.float32) / 25
smooth = cv2.filter2D(img, -1, kernel)

# Built-in shortcut
smooth2 = cv2.blur(img, (5,5))

cv2.imwrite("smooth.jpg", smooth)
কেন ভাগ ২৫ দিয়ে?
২৫টি pixel-এর গড় চাইছি। যোগ করে kernel-এর element-গুলো ১ না হলে ছবির brightness বদলে যায়।

Sharpening Kernel

python
import cv2, numpy as np

img = cv2.imread("soft.jpg")

kernel = np.array([[ 0, -1,  0],
                   [-1,  5, -1],
                   [ 0, -1,  0]])
sharp = cv2.filter2D(img, -1, kernel)

কেন্দ্রে ৫, চারপাশে -১ — মাঝের pixel-কে boost করছে, প্রতিবেশীদের থেকে তফাত বাড়াচ্ছে। ফলে edge আরও স্পষ্ট।

Edge-detection kernel (preview)

python
Kx = np.array([[-1,0,1],
               [-2,0,2],
               [-1,0,1]])   # Sobel-X — vertical edge
Ky = Kx.T                  # horizontal edge

পরের অধ্যায়ে Sobel, Canny বিস্তারিত আসছে।

Padding ও Border

ছবির কোণে kernel গেলে পাশে pixel নেই — কী করব? OpenCV কয়েকটি strategy দেয়:

python
cv2.filter2D(img, -1, k, borderType=cv2.BORDER_REFLECT)
# BORDER_CONSTANT — শূন্য দিয়ে ভরবে
# BORDER_REPLICATE — শেষ pixel repeat
# BORDER_REFLECT  — আয়না (default in many funcs)

কেন এটি Deep Learning-এর ভিত্তি?

CNN-এর প্রতিটি “conv layer” আসলে এমন kernel শেখে — কিন্তু আমাদের মতো হাতে না লিখে, training data থেকে। এই অধ্যায় বোঝা মানে Phase 5-এর CNN অনেক সহজ।

প্র্যাকটিস টাস্ক
  1. নিজে একটি 3×3 emboss kernel ([[-2,-1,0],[-1,1,1],[0,1,2]]) প্রয়োগ করুন।
  2. একটি ছবির উপর 3×3, 7×7, 15×15 average blur দিয়ে পার্থক্য দেখুন।
  3. filter2D ছাড়া NumPy দিয়ে নিজেই একটি tiny convolution function লিখুন।

সারসংক্ষেপ

  • Convolution = kernel-কে ছবির উপর slide + multiply + sum।
  • Kernel-এর design = filter-এর কাজ (blur, sharp, edge)।
  • OpenCV-তে কেন্দ্রীয় function = cv2.filter2D।
  • এটি classical image processing ও আধুনিক CNN — দুটোরই ভিত্তি।