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 จะแสดงภาพขนาดปรกติ