OpenCV การปรับขนาดรูปภาพ
ในบทนี้จะพูดถึงเรื่องการย่อขนาดภาพโดยใช้ Resize Image ใน การปรับขนาดรูปภาพ ใน C++ ของ ไลบรารี OpenCV โดย ค่า เริ่มต้น การปรับ ขนาด จะ เปลี่ยน เฉพาะ ความกว้าง และ ความสูง ของ รูปภาพ อัตราส่วนภาพ และ การครอบตัดรูปภาพ
ขั้นตอนการทํางาน
# ภาพระดับสีเทา ภาพเบลอ และ ภาพแคนนี
โดยศึกษา ขั้นตอนการทำงาน จากลิงค์บทความ ด้านล่าง
1 : OpenCV ตรวจสอบขนาดรูปภาพ
ตรวจสอบขนาดรูปภาพ ด้วยคำสั่ง
endl ใช้เพื่อแทรกบรรทัดใหม่ และให้ อ็อบเจกต์ cout เป็นคลาสใน C++ Library สืบทอดมาจาก เนมสเปซ std แสดงผลการอ่านค่าจาก img.size() ที่สร้างจากคลาส Mat หรือ เมทริกซ์ เป็นคลาสใน OpenCV Library สืบทอดมาจาก เนมสเปซ cv
cout << img.size() << endl;
เขียนโค้ดดังนี้
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
string path = "Resources/test.png";
Mat img = imread(path);
cout << img.size() << endl;
imshow("Image", img);
waitKey(0);
return 0;
}
แสดงขนาดรูปภาพมีหน่วยเป็นพิกเซล ในตัวอย่าง เป็นภาพขนาด ความกว้าง 650 และ ความสูง 650
2 : OpenCV ปรับขนาดรูปภาพด้วย การระบุพิกเซล
@คำสั่งที่เพิ่มเข้ามา
ตัวแปร อินสแตนซ์ (instance) ชื่อ imgResize สร้างจากคลาส Mat หรือ เมทริกซ์ เป็นคลาสใน OpenCV Library สืบทอดมาจาก เนมสเปซ cv
Mat imgResize;
ใช้คำสั่ง resize จาก OpenCV Library ปรับขนาดรูปภาพ ของอ็อบเจกต์ imgResize เป็นขนาด 450 x 450 พิกเซล
resize(img , imgResize, Size(450,450));
แสดงรูปภาพ ด้วยคำสั่ง imshow มาจาก I am show ด้วยชื่อออปเจ็ค img Resize และข้อมูลจากตัวแปร เมทริกซ์ ชื่อ imgResize
imshow("img Resize", imgResize);
เขียนโค้ดดังนี้
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
string path = "Resources/test.png";
Mat img = imread(path);
Mat imgResize;
resize(img , imgResize, Size(450,450));
imshow("Image", img);
imshow("img Resize", imgResize);
waitKey(0);
return 0;
}
ผลลัพธ์การทำงาน img Resize แสดงภาพที่ปรับขนาดเหลือ 450 x 450 และ Image จะแสดงภาพขนาดปรกติ คือ 650 x 650 พิกเซล
3 : OpenCV ปรับขนาดรูปภาพด้วย ด้วยอัตราส่วน
ในการ ปรับขนาดรูปภาพด้วย การระบุพิกเซล ถ้า ขนาด ของ ความกว้าง และ ความสูง มีค่าที่เท่ากัน ก็สามารถใช้ได้ไม่เป็นปัญหาอะไร แต่ถ้าถ้า ความกว้าง และ ความสูง ไม่เท่ากัน เช่น ขนาด 800 x 450 หรืออื่นๆก็อาจมีปัญหาในการแสดงผลไม่ถูกต้อง ดังนั้นต้องเลือกใช้วิธี ปรับขนาดรูปภาพด้วย ด้วยอัตราส่วน
@คำสั่งที่เพิ่มเข้ามา
ใช้คำสั่ง resize จาก OpenCV Library ปรับขนาดรูปภาพ ของอ็อบเจกต์ imgResize ลดขนาด ด้วยตราส่วน 50%
resize(img , imgResize, Size(), 0.5, 0.5);
เขียนโค้ดดังนี้
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
string path = "Resources/test.png";
Mat img = imread(path);
Mat imgResize;
resize(img , imgResize, Size(), 0.5, 0.5);
imshow("Image", img);
imshow("img Resize", imgResize);
waitKey(0);
return 0;
}
ผลลัพธ์การทำงาน img Resize แสดงภาพที่ปรับขนาดลดลงเหลือ 50% และ Image จะแสดงภาพขนาดปรกติ คือ 650 x 650 พิกเซล
4 : OpenCV การครอบตัดรูปภาพ
การครอบตัดรูปภาพ ใช้งานสำหรับการต้องการภาพเป็นบางส่วน ดังตัวอย่างด้านล่าง
@คำสั่งที่เพิ่มเข้ามา
ตัวแปร อินสแตนซ์ (instance) ชื่อ imgCrop สร้างจากคลาส Mat หรือ เมทริกซ์ เป็นคลาสใน OpenCV Library สืบทอดมาจาก เนมสเปซ cv
Mat imgCrop;
ในการครอบตัดรูปภาพ เราต้องระบุพื้นที่ที่ต้องการในรูปสี่เหลี่ยมผืนผ้า
ตัวแปร อินสแตนซ์ (instance) ชื่อ roi สร้างจากคลาส Rect คือ สี่เหลี่ยมผืนผ้า เป็นคลาสใน OpenCV Library สืบทอดมาจาก เนมสเปซ cv
แล้วระบุพื้นที่ที่ต้องการ ดังนี้
x,y : พิกัดมุมซ้ายบน
w,h : ความกว้างและความสูงของสี่เหลี่ยมผืนผ้า
x คือ ตำแหน่งที่ต้องการ crop แกน x (พิกเซล)
y คือ ตำแหน่งที่ต้องการ crop แกน y (พิกเซล)
w คือ ความกว้างขนาดที่ต้องการ crop (พิกเซล)
h คือ ความสูงขนาดที่ต้องการ crop (พิกเซล)
Rect roi(x, y, w, h);
Rect roi(150, 130, 300, 400);
imgCrop รับการอ่านค่ารูปภาพจาก พื้นที่ที่ต้องการจากตัวแปร roi
imgCrop = img(roi);
แสดงรูปภาพ ด้วยคำสั่ง imshow มาจาก I am show ด้วยชื่อออปเจ็ค img Crop และข้อมูลจากตัวแปร เมทริกซ์ ชื่อ imgCrop
imshow("img Crop", imgCrop);
เขียนโค้ดดังนี้
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
string path = "Resources/test.png";
Mat img = imread(path);
Mat imgCrop;
Rect roi(150, 130, 300, 400);
imgCrop = img(roi);
imshow("Image", img);
imshow("img Crop", imgCrop);
waitKey(0);
return 0;
}
ผลลัพธ์การทำงาน img Crop แสดงรูปภาพที่ครอบตัดเป็นบางส่วนออกมา และ Image จะแสดงภาพขนาดปรกติ