**OpenCv 图像的基本操作 **
图像的四种基本操作:访问和修改像素值、图像 ROI (Region of Interest) 操作、图像通道分离与合并、以及图像的缩放、旋转、平移和翻转
常用方法:
操作 函数/方法 说明
访问像素值 image[y, x] 获取或修改像素值。
图像 ROI image[y1:y2, x1:x2] 获取或修改图像中的矩形区域。
通道分离与合并 cv2.split() / cv2.merge() 分离或合并图像通道。
图像缩放 cv2.resize() 调整图像大小。
图像旋转 cv2.getRotationMatrix2D() 旋转图像。
图像平移 cv2.warpAffine() 平移图像。
图像翻转 cv2.flip() 翻转图像。
图像加法 cv2.add() 对两幅图像进行加法运算。
图像减法 cv2.subtract() 对两幅图像进行减法运算。
图像混合 cv2.addWeighted() 对两幅图像进行加权混合。
阈值处理 cv2.threshold() 对图像进行阈值处理。
平滑处理 cv2.blur() / cv2.GaussBlur() 对图像进行平滑处理。
1.访问像素和修改像素值
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 读取图像
cv::Mat img = cv::imread("image.jpg");
// 检查图像是否成功加载
if (img.empty())
{
std::cout << "Could not open or find the image!" << std::endl;
return -1;
}
// 访问像素值
//使用img.at<cv::Vec3b>(100, 150)访问图像中(100, 150)位置的像素值
cv::Vec3b pixelValue = img.at<cv::Vec3b>(100, 150);
std::cout << "Pixel value: " << static_cast<int>(pixelValue[0]) << ", "
<< static_cast<int>(pixelValue[1]) << ", "
<< static_cast<int>(pixelValue[2]) << std::endl;
//修改像素值
// 将(150, 100) 位置的像素值设置为白色
img.at<cv::Vec3b>(150, 100) = cv::Vec3b(255, 255, 255);
return 0;
}
2.图像ROI操作
ROI 是指图像中我们感兴趣的区域。通过提取 ROI,我们可以只对图像的特定部分进行处理,从而提高处理效率。
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 假设 img 是一个已经加载的图像
cv::Mat img = cv::imread("path_to_image.jpg");
if (img.empty())
{
std::cout << "Could not open or find the image" << std::endl;
return -1;
}
// 提取 ROI
cv::Mat roi = img(cv::Rect(0, 0, 100, 100));
// 修改 ROI
roi.setTo(cv::Scalar(0, 255, 0)); // 将 ROI 区域设置为绿色
// 将修改后的 ROI 放回原图像
// 注意:在C++中,直接修改 roi 会自动更新 img 中相应的区域,无需显式放回
// 显示图像(可选)
cv::imshow("Image with ROI", img);
cv::waitKey(0);
return 0;
}
3.图像通道分离与合并
#include <opencv2/opencv.hpp>
// 假设img是一个Mat类型的变量,表示输入图像
cv::Mat b, g, r;
cv::split(img, std::vector<cv::Mat>{b, g, r});
// 通道合并,为彩色图像保存在merged_img
cv::Mat merged_img;
cv::merge(std::vector<cv::Mat>{b, g, r}, merged_img);
4.图像缩放、旋转、平移、翻转
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 读取图像
cv::Mat img = cv::imread("dog.jpg");
if (img.empty())
{
std::cout << "Could not open or find the image!" << std::endl;
return -1;
}
// 图像缩放
cv::Mat resized_img;
cv::resize(img, resized_img, cv::Size(200, 200)); // 将图像缩放为 200x200 像素
// 图像旋转
int h = img.rows;
int w = img.cols;
cv::Point2f center(w / 2.0, h / 2.0);
cv::Mat M = cv::getRotationMatrix2D(center, 45, 1.0); // 旋转 45 度
cv::Mat rotated_img;
cv::warpAffine(img, rotated_img, M, cv::Size(w, h));
// 图像平移
M = (cv::Mat_<double>(2, 3) << 1, 0, 100, 0, 1, 50); // 向右平移 100 像素,向下平移 50 像素
cv::Mat translated_img;
cv::warpAffine(img, translated_img, M, cv::Size(w, h));
// 图像翻转
cv::Mat flipped_img;
cv::flip(img, flipped_img, 1); // 水平翻转
// 显示图像
cv::imshow("Original Image", img);
cv::imshow("Resized Image", resized_img);
cv::imshow("Rotated Image", rotated_img);
cv::imshow("Translated Image", translated_img);
cv::imshow("Flipped Image", flipped_img);
// 等待按键按下
cv::waitKey(0);
return 0;
}