পাঠ ৫৩ · ৫৭-এর মধ্যে · মডিউল ১২
Home / Courses / Digital Signal Processing / ইমেজ প্রসেসিং

ইমেজ প্রসেসিং-এ DSP — 2D কনভোলিউশনের ভিত্তি

DSP in image processing — 2D convolution basics
১০ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • একটি ছবি কীভাবে সংখ্যার একটি ২D গ্রিড হিসেবে প্রতিনিধিত্ব করা হয়
  • M3-এর ১D কনভোলিউশন কীভাবে দুই মাত্রায় সম্প্রসারিত হয়, এবং আউটপুট গ্রিডের আকার কীভাবে নির্ধারিত হয়
  • একটি এজ-ডিটেকশন কার্নেল হাতে প্রয়োগ করে সত্যিকারের গণনা দিয়ে দেখা কীভাবে এটি প্রান্ত শনাক্ত করে
  • কার্নেলের পছন্দ (এজ-ডিটেকশন বনাম ব্লার) কীভাবে সম্পূর্ণ ভিন্ন ইমেজ-প্রসেসিং প্রভাব তৈরি করে

১ · একটি ছবি আসলে সংখ্যার একটি ২D গ্রিড

বাস্তব একটি ডিজিটাল ছবিতে প্রতিটি পিক্সেলের একটি উজ্জ্বলতা (grayscale-এর ক্ষেত্রে একটি সংখ্যা, সাধারণত ০–২৫৫; রঙিন ছবিতে RGB-এর জন্য তিনটি সংখ্যা) থাকে, আর পুরো ছবি হাজার হাজার পিক্সেলের একটি বিশাল গ্রিড। এই পাঠে আমরা ধারণাটি বোঝার জন্য একটি অনেক ছোট, সম্পূর্ণ সিন্থেটিক ৮×৮ গ্রিড ব্যবহার করব — একটি উজ্জ্বল (মান ১) বর্গক্ষেত্র একটি অন্ধকার (মান ০) ব্যাকগ্রাউন্ডের ওপর। এটি কোনো ক্যামেরা দিয়ে তোলা বাস্তব ছবি নয় — শুধু কনসেপ্ট স্পষ্ট করার জন্য একটি হাতে-বানানো, যাচাইযোগ্য প্যাটার্ন।

Python
# *** সম্পূর্ণ সিন্থেটিক ৮x৮ "ছবি" -- কোনো বাস্তব ফটোগ্রাফ নয় ***
img = [[0] * 8 for _ in range(8)]
for r in range(2, 6):
    for c in range(2, 6):
        img[r][c] = 1

print("সিন্থেটিক ৮×৮ 'ছবি' (১ = উজ্জ্বল বর্গক্ষেত্র, ০ = অন্ধকার ব্যাকগ্রাউন্ড):")
for row in img:
    print(" ".join(str(v) for v in row))

    
ছবি = ২D সিগন্যাল
M1-এর "সিগন্যাল = সংখ্যার সিরিজ" ধারণাই এখানে দুই মাত্রায় প্রসারিত — একটি সারি-কলাম গ্রিড।
সম্পূর্ণ সিন্থেটিক
৮×৮ গ্রিডটি কোডে সরাসরি তৈরি করা, ধারণা স্পষ্ট করতে; বাস্তব ছবি হাজার হাজার পিক্সেলের, একাধিক চ্যানেলের।
M3-এর সম্প্রসারণ
১D কনভোলিউশন সাম মূলত একই — শুধু কার্নেল এখন দুই দিকে স্লাইড করে।

২ · 2D কনভোলিউশন — 1D ধারণার সম্প্রসারণ

M3/L10-এ ১D কনভোলিউশন ছিল $y[n] = \sum_{k} x[n-k] \, h[k]$ — একটি কার্নেল $h$-কে সিগন্যাল $x$-এর ওপর স্লাইড করিয়ে প্রতিটি অবস্থানে ওজনযুক্ত যোগফল নেওয়া। ২D কনভোলিউশনে ঠিক একই ধারণা, শুধু সারি ও কলাম — দুই মাত্রায়:

$$y[i,j] = \sum_{u} \sum_{v} x[i-u,\, j-v] \, h[u,v]$$

বাস্তবে ইমেজ-প্রসেসিং ও অনেক ডিপ-লার্নিং লাইব্রেরি প্রায়ই এই সূত্রটির একটি ছোট রূপভেদ ব্যবহার করে যাকে টেকনিক্যালি বলা হয় "correlation" (কার্নেল উল্টানো হয় না) — কিন্তু নিচে ব্যবহৃত এজ-ডিটেকশন কার্নেলটি সিমেট্রিক বলে এই দুইয়ের মধ্যে ফলাফলে কোনো পার্থক্য পড়ে না। আমরা "valid" কনভোলিউশন ব্যবহার করব — শুধু সেই অবস্থানগুলোতে গণনা করা হয় যেখানে কার্নেল সম্পূর্ণভাবে ছবির ভেতরে ফিট করে, ফলে $H \times W$ ইনপুট আর $k_h \times k_w$ কার্নেলের জন্য আউটপুট আকার হয় $(H - k_h + 1) \times (W - k_w + 1)$ — M3-এর "full" কনভোলিউশনের আউটপুট-দৈর্ঘ্য সূত্র $len(x)+len(h)-1$-এর মতোই, শুধু ২D-তে এখানে সীমানার বাইরে না গিয়ে সংক্ষিপ্ত (shrunk) আউটপুট বেছে নেওয়া হয়েছে।

৩ · এজ-ডিটেকশন কার্নেল দিয়ে সত্যিকারের গণনা

নিচে একটি ক্লাসিক এজ-ডিটেকশন কার্নেল (Laplacian-স্টাইল, কেন্দ্রে ৮ ও চারপাশে −১) হাতে-লেখা নেস্টেড-লুপ দিয়ে ৮×৮ ছবির ওপর প্রয়োগ করা হচ্ছে। এই কার্নেলের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য — এর সবগুলো মান যোগ করলে শূন্য হয় ($8 - 8 \times 1 = 0$), তাই সম্পূর্ণ সমতল (uniform) অঞ্চলে আউটপুট সবসময় শূন্য হবে; শুধু যেখানে পিক্সেল মান হঠাৎ বদলায় (একটি প্রান্ত/এজ) সেখানেই অ-শূন্য মান দেখা দেয়।

Python
kernel = [
    [-1, -1, -1],
    [-1,  8, -1],
    [-1, -1, -1],
]   # ক্লাসিক এজ-ডিটেকশন (Laplacian-স্টাইল) কার্নেল

def conv2d_valid(x, k):
    H, W = len(x), len(x[0])
    kh, kw = len(k), len(k[0])
    oh, ow = H - kh + 1, W - kw + 1
    out = [[0] * ow for _ in range(oh)]
    for i in range(oh):
        for j in range(ow):
            s = 0
            for u in range(kh):
                for v in range(kw):
                    s += x[i + u][j + v] * k[u][v]
            out[i][j] = s
    return out

out = conv2d_valid(img, kernel)

print(f"কার্নেল যোগফল: {sum(sum(row) for row in kernel)}  (শূন্য -> সমতল অঞ্চলে আউটপুট শূন্য হবে)")
print(f"আউটপুট গ্রিডের আকার: {len(out)}×{len(out[0])}  "
      f"(ইনপুট 8×8, কার্নেল 3×3 -> (8-3+1)×(8-3+1))")
print()
for row in out:
    print(" ".join(f"{v:>3}" for v in row))

    
আউটপুট ৬×৬ (প্রত্যাশিত $8-3+1=6$ অনুযায়ী)। গ্রিডের কেন্দ্রীয় ২×২ অংশে (যেখানে বর্গক্ষেত্রের সম্পূর্ণ ভেতরে, সব প্রতিবেশী পিক্সেলও ১) মান ঠিক ০ — সমতল অঞ্চল, কোনো এজ নেই। কিন্তু বর্গক্ষেত্রের প্রান্তের কাছাকাছি অবস্থানে মান ৫ ও ৩-এর মতো অ-শূন্য পজিটিভ মান দেখা যাচ্ছে (কেন্দ্র উজ্জ্বল কিন্তু কিছু প্রতিবেশী অন্ধকার), আর কোণার বাইরের অবস্থানে −১, −২, −৩-এর মতো নেগেটিভ মান (কেন্দ্র অন্ধকার কিন্তু কাছেই উজ্জ্বল অঞ্চল)। এই প্যাটার্নই এজ-ডিটেকশনের সারমর্ম — কার্নেল শুধুমাত্র সেখানেই "সাড়া" দেয় যেখানে পিক্সেল মান দ্রুত বদলাচ্ছে।
সহোদর কার্নেল · অন্য প্রয়োগ

একই conv2d_valid ফাংশন ভিন্ন কার্নেল দিয়ে সম্পূর্ণ ভিন্ন প্রভাব তৈরি করে — একটি সরল গড়-নেওয়া (averaging/blur) কার্নেল যেমন $\frac{1}{9}\begin{bmatrix}1&1&1\\1&1&1\\1&1&1\end{bmatrix}$ (সব মান ধনাত্মক, যোগফল ১) প্রয়োগ করলে ছবি ঝাপসা/মসৃণ হয়ে যায় — এটি আসলে M7-এর মুভিং-এভারেজ FIR লো-পাস ফিল্টারেরই ২D সংস্করণ। এজ-ডিটেকশন কার্নেল (উঁচু-ফ্রিকোয়েন্সি বিষয়বস্তুতে জোর দেয়) আর ব্লার কার্নেল (নিম্ন-ফ্রিকোয়েন্সি বিষয়বস্তু রাখে, উচ্চ-ফ্রিকোয়েন্সি দমন করে) — এই দুটোই M6-M7-এর ফ্রিকোয়েন্সি-ডোমেইন চিন্তার সাথে সরাসরি সংযুক্ত, শুধু এবার দুই মাত্রায়।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ কেন্দ্রীয় ২×২ অংশে আউটপুট ঠিক ০ কেন? বর্গক্ষেত্রের ভেতরে তো সব পিক্সেল উজ্জ্বল (মান ১) — তাহলে যোগফল শূন্য কীভাবে হলো?

এই অবস্থানগুলোতে ৩×৩ প্রতিবেশী সম্পূর্ণভাবে বর্গক্ষেত্রের ভেতরে পড়ে, তাই সবগুলো পিক্সেল মান ১। কার্নেল প্রয়োগ করলে হয় $8 \times 1 + (-1) \times 1 \times 8 = 8 - 8 = 0$। যেহেতু কার্নেলের যোগফল শূন্য এবং প্রতিবেশীর সব মান সমান, ফলাফল সবসময় শূন্য হবে — এটাই একটি "সমতল অঞ্চলে সাড়া নেই" ফিল্টারের সংজ্ঞাগত বৈশিষ্ট্য।

প্র ০২ আউটপুট গ্রিডের কোণাগুলোতে (যেমন out[0][0]) মান −১ কেন, যেখানে বর্গক্ষেত্রের দূরের কোণায় প্রায় পুরোটাই অন্ধকার পিক্সেল?

out[0][0] গণনা করতে img-এর সারি ০-২, কলাম ০-২ ব্যবহার হয় — সবগুলোই ব্যাকগ্রাউন্ডে (মান ০), বর্গক্ষেত্র থেকে দূরে। তাহলে সরল যোগফল $8 \times 0 - 8 \times 0 = 0$ হওয়া উচিত মনে হতে পারে, কিন্তু বাস্তবে img[2][2] (এই ৩×৩ জানালার একেবারে কোণায়) বর্গক্ষেত্রের প্রথম উজ্জ্বল পিক্সেল — সেখানে কার্নেলের একটি −১ ওজন পড়ে, বাকি সব ০। ফলাফল: $-1 \times 1 = -1$। এটি দেখায় কার্নেল কতটা "স্থানীয়ভাবে সংবেদনশীল" — একটি মাত্র পিক্সেলও আউটপুটকে প্রভাবিত করতে পারে।

প্র ০৩ এই ৮×৮ গ্রিডটি সত্যিকারের কোনো ছবি নয় — তাহলে বাস্তব ছবিতে (হাজার হাজার পিক্সেল, একাধিক রঙিন চ্যানেল) কী পরিবর্তন হয়, আর কী একই থাকে?

মূল অ্যালগরিদম (নেস্টেড লুপে কার্নেল স্লাইড করানো ও ওজনযুক্ত যোগফল নেওয়া) ঠিক একই থাকে। যা বদলায়: (১) স্কেল — লক্ষ লক্ষ পিক্সেল, তাই বাস্তব সিস্টেমে এই নেস্টেড-লুপ পদ্ধতি অনেক ধীর, বিশেষ হার্ডওয়্যার/ অপ্টিমাইজড লাইব্রেরি ব্যবহার হয়; (২) চ্যানেল — রঙিন ছবিতে সাধারণত R, G, B — তিনটি আলাদা ২D গ্রিডে একই কার্নেল প্রয়োগ হতে পারে বা চ্যানেল-জুড়ে মিলিয়ে; (৩) সীমানা হ্যান্ডলিং — "valid" ছাড়াও ছবির প্রান্তে জিরো-প্যাডিং (M5/L25-এর ধারণার সাথে সম্পর্কিত) বা প্রতিফলন-প্যাডিং ব্যবহার করে আউটপুট আকার ইনপুটের সমান রাখা যায়।

অনুশীলন

  1. চিন্তা করুন: যদি এজ-ডিটেকশন কার্নেলের বদলে একটি সরল $3\times3$ গড়-নেওয়া কার্নেল (সবগুলো মান $1/9$) কেন্দ্রীয় ২×২ (সম্পূর্ণ ভেতরের) অবস্থানে প্রয়োগ করা হতো, আউটপুট মান কত হতো বলে মনে হয়?

    কেন্দ্রীয় অবস্থানে সব ৯টি প্রতিবেশী পিক্সেলের মান ১, তাই আউটপুট $9 \times (1/9) \times 1 = 1$ — অর্থাৎ ইনপুট মানই অপরিবর্তিত থাকবে (কারণ পুরো ৩×৩ জানালা সমতল)। আসল পার্থক্য দেখা যাবে বর্গক্ষেত্রের প্রান্তের কাছে, যেখানে গড়-নেওয়া কার্নেল উজ্জ্বল ও অন্ধকার পিক্সেলের একটি মসৃণ মধ্যবর্তী মান দেবে (যেমন $0$ থেকে $1$-এর মাঝামাঝি কিছু), এজ-ডিটেকশন কার্নেলের বিপরীতে যা তীক্ষ্ণ প্রান্ত হাইলাইট করে।

  2. পরীক্ষা করুন: উপরের কোড সেলে kernel-কে [[1/9, 1/9, 1/9], [1/9, 1/9, 1/9], [1/9, 1/9, 1/9]]-এ বদলে Run চেপে আউটপুট গ্রিড দেখুন — আপনার হিসেব মিলছে কিনা যাচাই করুন।

    রান করলে কেন্দ্রীয় ২×২ অবস্থানে ঠিক ১.০ দেখাবে, আর প্রান্তের কাছাকাছি অবস্থানে ০ থেকে ১-এর মধ্যে ভগ্নাংশ মান (যেমন প্রায় ০.৪৪, ০.৬৭ ইত্যাদি, অবস্থানভেদে) দেখাবে — এজ-ডিটেকশন কার্নেলের তীক্ষ্ণ, বড় (৫, ৩, −৩) মানের বদলে একটি মসৃণ ট্রানজিশন। এটাই একটি ব্লার/লো-পাস কার্নেলের বৈশিষ্ট্য — উচ্চ-ফ্রিকোয়েন্সি (তীক্ষ্ণ পরিবর্তন) দমন করে, নিম্ন-ফ্রিকোয়েন্সি (গড় উজ্জ্বলতা) রাখে।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

  • কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ স্যাম্পলিং, কনভোলিউশন, Z-ট্রান্সফর্ম, DTFT/DFT, FFT, FIR/IIR ফিল্টার ডিজাইন, মাল্টিরেট প্রসেসিং, স্পেকট্রাল এস্টিমেশন, র‍্যান্ডম সিগন্যাল প্রসেসিং, বাস্তব প্রয়োগ ও ক্যাপস্টোন।
  • Math for AI & ML কোর্স সহোদর কোর্স লিনিয়ার আলজেব্রা, ম্যাট্রিক্স অপারেশন ও কনভোলিউশনের গাণিতিক ভিত্তি — ইমেজ প্রসেসিং ও ডিপ লার্নিং উভয়ের জন্য গুরুত্বপূর্ণ প্রেক্ষাপট।
  • সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, Machine Learning, Deep Learning, System Design, Cybersecurity, Cloud Computing & DevOps, এবং আরও অনেক কোর্স — সব এক জায়গায়।
আগের পাঠ
অডিও প্রসেসিং-এ DSP