iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0

一、介紹

上一個主題我們介紹了影像金字塔,將圖片以四倍面積縮小。但很多時候我們需要的大小和比例無法透過高斯金字塔生成,這個時候我們就需要使用到其他的方式來達成影像的縮放。這個主題會講解如何使用OpenCV實現影像的縮放、拼貼、剪裁。

二、程式碼

1. 逐行解釋

1) 使用OpenCV調整影像大小

img中的圖像內容調整為256x256像素的大小,並將結果存儲在small_img中。調整大小的過程會根據目標大小對圖像進行縮放,可能會改變圖像的外觀比例。

// 調整圖像大小為256x256像素
cv::resize(img, small_img, cv::Size(256, 256));
  • img是原始的輸入圖像,即需要進行調整大小的圖像。
  • small_img是目標圖像,它將存儲調整大小後的圖像。
  • cv::Size(256, 256)是目標圖像的大小,這裡指定為256x256像素。

2) 使用OpenCV拼貼影像

cv::Rect roi = cv::Rect(
    resize_img.cols / 2 - small_img.cols / 2, resize_img.rows / 2 - small_img.rows / 2,
    small_img.cols, small_img.rows);

// 將small_img複製到resize_img的ROI區域
small_img.copyTo(resize_img(roi));
  • roi:設定small_img要拼貼到resize_img的區域,我們將它設在resize_img中心區域。
  • small_img.copyTo(resize_img(roi)):將small_img拼貼到resize_img中roi的區域。

3) 使用OpenCV剪裁影像

要取出一張影像某個區域的內容其實很簡單,只要將需要剪裁的影像後面加個括號並放入指定的cv::Rect區域,就可以完成剪裁。

// 建立一個新的Mat物件cropImage,用於存儲resize_img中的ROI區域
cv::Mat cropImage = resize_img(roi);
  • roi:設定要從resize_img剪裁的區域。
  • cropImage:剪裁過後的影像。

2. 完整程式碼

#include "opencv2/opencv.hpp"
#include "opencv2/core/utils/logger.hpp"

using namespace std;

int main()
{
	// 設定OpenCV的日誌級別為SILENT,以禁用日誌輸出
	cv::utils::logging::setLogLevel(cv::utils::logging::LOG_LEVEL_SILENT); 

	// 讀取名為"Lenna.png"的彩色圖像
	cv::Mat img = cv::imread("C:\\Users\\vince\\Downloads\\Lenna.png", cv::IMREAD_COLOR);

	// 建立一個空的Mat物件small_img來存儲調整大小後的圖像
	cv::Mat small_img;

	// 建立一個空的Mat物件resize_img來存儲輸出結果,並初始化為全黑彩色圖像
	cv::Mat resize_img = cv::Mat::zeros(img.size(), CV_8UC3);

	// 調整圖像大小為256x256像素
	cv::resize(img, small_img, cv::Size(256, 256));

	// 計算ROI(Region of Interest),以便將small_img複製到resize_img的中央位置
	cv::Rect roi = cv::Rect(
		resize_img.cols / 2 - small_img.cols / 2, resize_img.rows / 2 - small_img.rows / 2,
		small_img.cols, small_img.rows);

	// 將small_img複製到resize_img的ROI區域
	small_img.copyTo(resize_img(roi));

	// 建立一個新的Mat物件cropImage,用於存儲resize_img中的ROI區域
	cv::Mat cropImage = resize_img(roi);

	// 顯示整個resize_img
	cv::imshow("Output", resize_img);

	// 顯示cropImage,即resize_img中的ROI區域
	cv::imshow("Crop Image", cropImage);

	// 等待按鍵輸入,直到使用者按下鍵盤上的任意按鍵
	cv::waitKey(0);

	return 0;
}

3. 輸出結果

https://ithelp.ithome.com.tw/upload/images/20230927/201617327qbh1YAVgW.png


上一篇
【Day16】​OpenCV 影像金字塔:不同尺度下的影像
下一篇
【Day18】​OpenCV HSV色彩空間轉換:手掌前景提取
系列文
圖解C++影像處理與OpenCV應用:從基礎到高階,深入學習超硬核技術!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言