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

วิธีเปลี่ยนค่าพิกเซลด้วย Direct Access Method ใน OpenCV

บทนำ

วิธี at ต้องระบุชนิดภาพทุกครั้งที่เข้าถึงพิกเซล วิธี Direct Access ใช้งานง่ายกว่า โดยระบุชนิด Mat ตั้งแต่ต้น เช่น Mat_<uchar>, Mat_<Vec3b>, Mat_<Vec2i> เป็นต้น

ตัวอย่าง: เพิ่ม Noise ให้ภาพด้วย Direct Access

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;

void direct_access(Mat_<Vec3b> &image, int n) {
    for (int x = 0; x < n; x++) {
        int i = rand() % image.cols; // คอลัมน์สุ่ม
        int j = rand() % image.rows; // แถวสุ่ม
        image(j, i) = 0; // ตั้งค่าพิกเซลเป็นสีดำ (0,0,0)
    }
}

int main() {
    Mat_<Vec3b> image;
    Mat unchanged_Image;
    
    image = imread("sky.jpg");
    unchanged_Image = imread("sky.jpg"); // โหลดภาพต้นฉบับไว้เปรียบเทียบ
    
    namedWindow("Noisy Image");
    namedWindow("Unchanged Image");
    
    direct_access(image, 4000); // เพิ่ม noise 4000 จุด
    
    imshow("Noisy Image", image);
    imshow("Unchanged Image", unchanged_Image);
    waitKey(0);
    return 0;
}

อธิบายการทำงาน

  • Mat_<Vec3b>: ประกาศเมทริกซ์สำหรับภาพสี 3 ช่องล่วงหน้า
  • image(j, i) = 0: ตั้งค่าพิกเซลที่ตำแหน่ง (j,i) เป็นสีดำ (Vec3b(0,0,0))
  • rand() % image.cols: สุ่มคอลัมน์ภายในขอบเขตภาพ
  • rand() % image.rows: สุ่มแถวภายในขอบเขตภาพ

การประยุกต์ใช้

วิธีนี้เหมาะสำหรับ:

  • การเพิ่ม Noise แบบสุ่ม (Salt & Pepper noise)
  • การวาดจุดหรือรูปทรงพื้นฐาน
  • การปรับเปลี่ยนพิกเซลจำนวนมากอย่างรวดเร็ว

ผลลัพธ์

วิธีเปลี่ยนค่าพิกเซลด้วย Direct Access Method ใน OpenCV

สรุป

Direct Access Method ให้ความสะดวกและความเร็วในการเข้าถึงและแก้ไขพิกเซล โดยเฉพาะเมื่อต้องทำงานกับภาพสี (Multi-channel) บ่อยครั้ง