上一個主題我們介紹了影像金字塔,將圖片以四倍面積縮小。但很多時候我們需要的大小和比例無法透過高斯金字塔生成,這個時候我們就需要使用到其他的方式來達成影像的縮放。這個主題會講解如何使用OpenCV實現影像的縮放、拼貼、剪裁。
將img
中的圖像內容調整為256x256像素的大小,並將結果存儲在small_img
中。調整大小的過程會根據目標大小對圖像進行縮放,可能會改變圖像的外觀比例。
// 調整圖像大小為256x256像素
cv::resize(img, small_img, cv::Size(256, 256));
img
是原始的輸入圖像,即需要進行調整大小的圖像。small_img
是目標圖像,它將存儲調整大小後的圖像。cv::Size(256, 256)
是目標圖像的大小,這裡指定為256x256像素。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的區域。要取出一張影像某個區域的內容其實很簡單,只要將需要剪裁的影像後面加個括號並放入指定的cv::Rect
區域,就可以完成剪裁。
// 建立一個新的Mat物件cropImage,用於存儲resize_img中的ROI區域
cv::Mat cropImage = resize_img(roi);
roi
:設定要從resize_img
剪裁的區域。cropImage
:剪裁過後的影像。#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;
}