บทนำ
ในภาพ Grayscale พิกเซลมีค่าเดียว แต่ในภาพสี RGB พิกเซลเป็นเวกเตอร์ 3 ค่า (B, G, R) บทความนี้สาธิตการใช้เมธอด at เพื่อเปลี่ยนค่าพิกเซลทั้งภาพ Grayscale และ RGB
ตัวอย่าง: เพิ่ม Noise ด้วยเมธอด at
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
void adding_Noise(Mat& image, int n) {
for (int x = 0; x < n; x++) {
int i = rand() % image.cols;
int j = rand() % image.rows;
if (image.channels() == 1) { // ภาพ Grayscale
image.at<uchar>(j, i) = 0;
}
if (image.channels() == 3) { // ภาพ RGB
image.at<Vec3b>(j, i)[0] = 0; // Blue
image.at<Vec3b>(j, i)[1] = 0; // Green
image.at<Vec3b>(j, i)[2] = 0; // Red
}
}
}
int main() {
Mat image, unchanged_Image;
image = imread("sky.jpg");
unchanged_Image = imread("sky.jpg");
namedWindow("Noisy Image");
namedWindow("Unchanged Image");
adding_Noise(image, 4000);
imshow("Noisy Image", image);
imshow("Unchanged Image", unchanged_Image);
waitKey(0);
destroyAllWindows();
return 0;
}
อธิบายโค้ดสำคัญ
- image.channels(): ตรวจสอบจำนวนช่องสี (1 = Grayscale, 3 = RGB)
- image.at<uchar>(j, i): เข้าถึงพิกเซลภาพ Grayscale ที่ตำแหน่ง (row=j, col=i)
- image.at<Vec3b>(j, i)[channel]: เข้าถึงช่องสีเฉพาะของภาพ RGB
- destroyAllWindows(): ปิดหน้าต่างทั้งหมดและปล่อยหน่วยความจำ
ข้อดีของเมธอด at
- Bounds Checking: ตรวจสอบขอบเขตอัตโนมัติ ป้องกัน Crash จากการเข้าถึงนอกพื้นที่
- Type Safety: ระบุ template type ชัดเจน ลดโอกาสผิดพลาด
- ทำงานได้กับทุกชนิดภาพ: เพียงแค่เปลี่ยน template parameter
ผลลัพธ์

สรุป
เมธอด at เหมาะสำหรับการเข้าถึงพิกเซลแบบสุ่มหรือไม่ต่อเนื่อง ที่ต้องการความปลอดภัย แม้จะช้ากว่า Pointer หรือ Direct Access เล็กน้อย