OpenCV ภาพระดับสีเทา ภาพเบลอ และ ภาพแคนนี
ขั้นตอนการทํางาน
# แสดงรูปภาพ , วิดีโอ และ เว็บแคม
โดยศึกษา ขั้นตอนการทำงาน จากลิงค์บทความ ด้านล่าง
1 : OpenCV แสดงภาพระดับสีเทา
สำหรับการเบลอภาพโดยใช้เคอร์เนลหรือตัวกรองด้วยแนวคิดพื้นฐานของการแปลงสัญญาณตัวกรองความถี่ต่ำความถี่ของภาพ ฯลฯ โดยการแปลงเป็นภาพสเกลสีเทา
ภาพเกรย์สเกลหรือภาพระดับสีเทา คือภาพ ขาว-ดำ-เทา โดยจะมีระดับความเข้มจากการแปลงสีเท่าคือ 0–255 ( 8-bit )
- ภาพเกรย์สเกลเกิดจากการแปลงภาพสี RGB มาเป็น Grayscale โดยใช้สูตรทางคณิตศาสตร์ Gray = 0.299R+0.587G+0.114*B
Gray : ค่าความเข้มของสีเทา มีค่า 0–255
R : มีค่า 0–255, G : มีค่า 0–255, B : มีค่า 0–255
cvtColor(img, imgGray, COLOR_BGR2GRAY);
เขียนโค้ดดังนี้
#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 imgGray;
cvtColor(img, imgGray, COLOR_BGR2GRAY);
imshow("Image Gray", imgGray);
waitKey(0);
return 0;
}
ผลลัพธ์การทำงาน
2 : OpenCV แสดงภาพเบลอ
เกาส์เซียนเบลอภาพด้วย OpenCV
OpenCV มีฟังก์ชั่นที่สร้างขึ้นในการดำเนินการ Blur Gaussian / Smoothing บนภาพได้อย่างง่ายดาย สิ่งที่คุณต้องระบุคือขนาดของเคอร์เนลเกาส์เซียนที่ภาพของคุณควรจะเชื่อมั่น นี่คือโปรแกรมง่าย ๆ ที่แสดงให้เห็นถึงวิธีการทำให้ภาพที่ราบรื่นด้วยเคอร์เนลเกาส์กับ OpenCV
GaussianBlur(img, imgBlur, Size(7, 7), 5, 0);
เขียนโค้ดดังนี้
#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 imgBlur;
GaussianBlur(img, imgBlur, Size(7, 7), 5, 0);
imshow("Image Blur", imgBlur);
waitKey(0);
return 0;
}
ผลลัพธ์การทำงาน
3 : OpenCV Image Canny
วิธีแคนนีเป็นหนึ่งในวิธีที่มีประสิทธิภาพสำหรับการหาขอบของรูปภาพ ประกอบด้วยการดำเนินการหลัก 4 ขั้นตอน คือ การปรับค่าสีโดยใช้ตัวกรองเกาส์เซียน การหาขนาดและทิศทางของการเปลี่ยนแปลงค่าสีของพิกเซล การพิจารณาขอบที่เป็นไปได้จากขนาดของการเปลี่ยนแปลงค่าสี และการใช้ค่าเกณฑ์สองระดับเพื่อกาหนดขอบเข้มและ ขอบไม่เข้ม
เขียนโค้ดดังนี้
#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 imgGray, imgBlur, imgCanny;
cvtColor(img, imgGray, COLOR_BGR2GRAY);
GaussianBlur(img, imgBlur, Size(3, 3), 3, 0);
Canny(imgBlur, imgCanny, 25, 75);
imshow("Image Canny", imgCanny);
waitKey(0);
return 0;
}
ผลลัพธ์การทำงาน
4 : OpenCV Image Diration
Dilation คือ การขยายภาพเป็นลักษณะของการเพิ่มข้อมูลภาพตามลำดับตลอดทั้งภาพ โดยจะเป็นเพิ่มส่วนสีขาวหรือขนาดของวัตถุเบื้องหน้า (Foreground) ปกติในกรณีการลด Noise นั้นจะใช้ Erosion ขยายและลดภาพสีขาวลง และจะทำให้วัตถุหดตัวลงโดยวิธีนี้เหมาะสำหรับการเพิ่มจุดที่เสียหายไป
#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 imgGray, imgBlur, imgCanny, imgDil , imgErode;
cvtColor(img, imgGray, COLOR_BGR2GRAY);
GaussianBlur(img, imgBlur, Size(3, 3), 3, 0);
Canny(imgBlur, imgCanny, 25, 75);
Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
dilate(imgCanny, imgDil, kernel);
imshow("Image Diration", imgDil);
waitKey(0);
return 0;
}
ผลลัพธ์การทำงาน
5 : OpenCV Image Erode
Erosion คือ การย่อภาพเป็นลักษณะของการลบข้อมูลภาพบริเวณขอบของภาพ โดยทั้งหมดที่อยู่ใกล้เคียงนั้นจะโดนลบออกไปตามขนาดของ kernel ดังนั้นความหนาหรือขนาดของวัตถุข้างหน้าจะลดลง(หรือพื้นที่ที่มีสีขาวก็จะลดลง) และสิ่งนั้นจะเป็นประโยชน์ด้านการลด noises ออก
#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 imgGray, imgBlur, imgCanny, imgDil , imgErode;
cvtColor(img, imgGray, COLOR_BGR2GRAY);
GaussianBlur(img, imgBlur, Size(3, 3), 3, 0);
Canny(imgBlur, imgCanny, 25, 75);
Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
dilate(imgCanny, imgDil, kernel);
erode(imgDil, imgErode, kernel);
imshow("Image Erode", imgErode);
waitKey(0);
return 0;
}
ผลลัพธ์การทำงาน