অধ্যায়Phase 1 · ফাউন্ডেশন
1.3 14 মিনিট পড়া

ছবি একটি ম্যাট্রিক্স হিসেবে

Pixel, intensity, এবং matrix representation।

🎬 গল্প দিয়ে শুরু
একটি ছবি আসলে কী? আপনি যেটি “মুখ” বা “আকাশ” হিসেবে দেখছেন, কম্পিউটারের কাছে সেটি কিছু সংখ্যার সারি-কলাম — একটি ম্যাট্রিক্স। এই matrix বুঝতে পারাই Computer Vision শেখার সবচেয়ে গুরুত্বপূর্ণ ভিত্তি।

Pixel — ছবির ক্ষুদ্রতম একক

Pixel মানে “picture element” — ছবির সবচেয়ে ছোট unit। প্রতিটি pixel আলোর intensity ধারণ করে। একটি grayscale ছবিতে প্রতিটি pixel-এ থাকে ০–২৫৫ এর মধ্যে একটি সংখ্যা — ০ মানে কালো, ২৫৫ মানে সাদা, মাঝখানের সব সংখ্যা ধূসরের বিভিন্ন shade।

কেন ০–২৫৫?
১ pixel-এর intensity store হয় ৮ bit-এ। ৮ bit = ২⁸ = ২৫৬টি ভিন্ন মান (০ থেকে ২৫৫)। এজন্যই “8-bit image” শব্দটি এত পরিচিত।

Grayscale ছবি = 2D Matrix

একটি grayscale ছবি যদি ৫×৫ resolution-এর হয়, সেটি দেখতে এমন:

text
5x5 grayscale image (intensity)
[[  0  20  40  60  80]
 [ 30  60  90 120 150]
 [ 60 100 140 180 220]
 [ 90 140 190 240 255]
 [120 180 230 255 255]]

এটি একটি সাধারণ ২-মাত্রিক matrix — shape = (5, 5)। প্রথম মাত্রা rows (উচ্চতা/height), দ্বিতীয় মাত্রা columns (প্রস্থ/width)। উপরের-বাম কোণ হলো (0, 0)

মনে রাখুন — OpenCV-তে অর্ডার (row, col)
ছবিতে আমরা সাধারণত (x, y) বলি, কিন্তু NumPy/OpenCV-তে index হয় image[y, x] অর্থাৎ আগে row (y), পরে column (x)।

Color ছবি = 3D Matrix

একটি color (RGB) ছবি আসলে তিনটি grayscale matrix একসাথে — একটি Red-এর জন্য, একটি Green-এর জন্য, একটি Blue-এর জন্য। এদের “channel” বলা হয়।

python
image shape inspection
import cv2

gray = cv2.imread("dhaka.jpg", cv2.IMREAD_GRAYSCALE)
color = cv2.imread("dhaka.jpg")  # BGR by default in OpenCV

print("Grayscale shape:", gray.shape)   # (H, W)
print("Color shape:    ", color.shape)  # (H, W, 3)
print("Total pixels:   ", gray.size)
print("Data type:      ", gray.dtype)
লাইন-বাই-লাইন ব্যাখ্যা
cv2.IMREAD_GRAYSCALE
ছবি single-channel (2D matrix) হিসেবে পড়ে।
color.shape == (H, W, 3)
৩টি channel মানে R, G, B (OpenCV-তে BGR order)।
gray.size
মোট pixel সংখ্যা = H × W।
gray.dtype
সাধারণত uint8 — অর্থাৎ প্রতিটি pixel ০–২৫৫।
OpenCV-এর গোপন কথা
OpenCV ছবি পড়ে BGR order-এ, RGB নয়। তাই matplotlib দিয়ে show করতে গেলে রং উল্টে যায়। সমাধান: cv2.cvtColor(img, cv2.COLOR_BGR2RGB).

হাতে-কলমে — নিজেই একটি ছবি বানান

python
create_image.py
import numpy as np
import cv2

# 100x100 black image
img = np.zeros((100, 100), dtype=np.uint8)

# Make the middle 40x40 square white
img[30:70, 30:70] = 255

# Make a gradient row
img[0, :] = np.linspace(0, 255, 100).astype(np.uint8)

cv2.imwrite("hand_made.png", img)
print("Saved! Shape:", img.shape)

কোনো camera ছাড়াই আপনি একটি ছবি তৈরি করলেন — শুধু সংখ্যা দিয়ে। এটিই প্রমাণ করে: ছবি = matrix

Memory হিসাব — একটি ছবি কত বড়?

একটি 1920×1080 RGB ছবির raw size:

text
1920 × 1080 × 3 channels × 1 byte = 6,220,800 bytes ≈ 5.93 MB

JPEG/PNG compression এই size ছোট করে আনে, কিন্তু RAM-এ ছবি লোড হওয়ার পর এই full size জায়গা দখল করে। Video processing-এ এটি জানা critical।

প্র্যাকটিস টাস্ক
  1. একটি 200×200 grayscale ছবি বানান যেখানে বাম-উপর থেকে ডান-নিচ পর্যন্ত diagonal gradient থাকবে।
  2. OpenCV দিয়ে একটি color ছবি পড়ে শুধু Red channel-কে আলাদা করে save করুন।
  3. একটি 4K (3840×2160) RGB ভিডিওর ৩০ সেকেন্ড raw form-এ কত GB হবে — হিসাব করে দেখুন।

সারসংক্ষেপ

  • Pixel = ছবির ক্ষুদ্রতম unit, intensity ০–২৫৫।
  • Grayscale = 2D matrix (H, W)। Color = 3D matrix (H, W, 3)।
  • OpenCV channel order = BGR, index order = [y, x]।
  • ছবি আসলে শুধু সংখ্যা — তাই NumPy দিয়ে যেকোনো image operation সম্ভব।