Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

วิธีเปลี่ยนค่าพิกเซลด้วยเมธอด at ใน OpenCV

บทนำ

ในภาพ 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 ใน OpenCV

สรุป

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