c++:opencv读图后mat矩阵的基本操作

使用OpenCV实现图像灰度化
本文通过一个具体的示例介绍了如何利用OpenCV库在C++中读取彩色图像并将其转换为灰度图像。文章展示了从读取图像到显示灰度图像的完整过程,并对图像的基本属性进行了说明。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{   //读图
    Mat scr = imread("C:/Users/dell/Desktop/图片变化/1024_699_3.jpg"); //此为你电脑上图片的路径
    //窗口命名
    namedWindow("林允儿", 0);
    //显示
    imshow("林允儿", scr);
    //创建一个新矩阵
    Mat dst;
    //将scr变成灰色给dst
    cvtColor(scr, dst, COLOR_BGR2GRAY); //图像灰度化
    namedWindow("灰度图", 1);
    //灰度图显示
    imshow("灰度图", dst);
    //通道数显示
    cout <<"原图的通道数 :" <<scr.channels() << endl;
    cout << "灰度图的通道数: "<<dst.channels()<<endl;
    //维数显示
    cout << "原图的维数 :" << scr.dims<< endl;
    cout << "灰度图的维数: " << dst.dims<< endl;
    //图的行列大小
    cout << "原图的行列分别为 :" << scr.rows << "  " << scr.cols << endl;
    cout << "灰度图的行列分别为: " << dst.rows << "  " << dst.cols << endl;
    //矩阵元素大小
    cout << "原图的一个元素的大小 :" << scr.elemSize()<< endl;
    cout << "灰度图的一个元素的大小: " << dst.elemSize()<< endl;
    //如果Mat中的数据类型是CV_8UC1,那么elemSize==1;如果是CV_8UC3或CV_8SC3,那么elemSize==3;如果是CV_16UC3或者CV_16SC3,那么elemSize==6;即elemSize是以8位(一个字节)为一个单位,乘以通道数和8位的整数倍;
    //索引矩阵中的一个元素
    int a = dst.at<uchar>(255, 255);
    cout << a << endl;
    waitKey(0);
    destroyAllWindows();
    return 0;
}
<think>我们正在解决如何在C++ OpenCV中找到cv::Mat矩阵的最大值或最小值的问题。 根据OpenCV文档,我们可以使用以下函数: 1. cv::minMaxLoc - 用于单通道矩阵(或特定通道) 2. 对于多通道矩阵,可能需要分离通道或使用其他方法 步骤: 1. 检查矩阵是否为空 2. 确定矩阵的通道数和深度(数据类型) 3. 根据通道数选择处理方法: 单通道:直接使用minMaxLoc 多通道:可以分别对每个通道求极值,或者将多通道矩阵重新塑造成单通道(但这样会改变结构,通常我们更关心每个通道的极值) 注意:minMaxLoc只能处理单通道,所以多通道矩阵需要分通道处理。 另外,如果矩阵有多个相同的最值位置,minMaxLoc默认返回第一个出现的位置。如果需要所有位置,则需要遍历矩阵。 我们将提供两种方法: 方法1:使用minMaxLoc(单通道) 方法2:处理多通道矩阵(分别对每个通道求极值) 同时,我们也可以使用cv::reduce或cv::min/max函数来求每行或每列的极值,但这里我们关注全局极值。 代码示例:</think># 在 C++ OpenCV 中查找 cv::Mat 矩阵的最大值和最小值 在 OpenCV 中查找矩阵的最大值和最小值是常见的图像处理任务,可以使用 `cv::minMaxLoc()` 函数高效实现。该函数可以处理单通道和多通道矩阵,并返回极值及其位置。 ## 核心函数:cv::minMaxLoc() ```cpp void minMaxLoc(InputArray src, double* minVal, double* maxVal = 0, Point* minLoc = 0, Point* maxLoc = 0, InputArray mask = noArray()); ``` 参数说明: - `src`:输入矩阵(单通道或多通道) - `minVal`:返回的最小值指针 - `maxVal`:返回的最大值指针 - `minLoc`:返回的最小值位置指针(仅单通道有效) - `maxLoc`:返回的最大值位置指针(仅单通道有效) - `mask`:可选掩码矩阵 ## 完整代码实现 ### 单通道矩阵示例 ```cpp #include <opencv2/opencv.hpp> #include <iostream> int main() { // 创建单通道矩阵 cv::Mat mat = (cv::Mat_<uchar>(3, 3) << 10, 20, 30, 40, 50, 60, 70, 80, 90); double minVal, maxVal; cv::Point minLoc, maxLoc; // 查找最小值和最大值及其位置 cv::minMaxLoc(mat, &minVal, &maxVal, &minLoc, &maxLoc); std::cout << "单通道矩阵:\n" << mat << "\n\n"; std::cout << "最小值: " << minVal << " 位置: (" << minLoc.x << ", " << minLoc.y << ")\n"; std::cout << "最大值: " << maxVal << " 位置: (" << maxLoc.x << ", " << maxLoc.y << ")\n"; return 0; } ``` ### 多通道矩阵(如 RGB 图像)示例 ```cpp #include <opencv2/opencv.hpp> #include <iostream> int main() { // 创建多通道矩阵(3通道) cv::Mat mat(3, 3, CV_8UC3); mat.forEach<cv::Vec3b>([](cv::Vec3b& pixel, const int* position) { pixel[0] = position[0] * 30; // 蓝色通道 pixel[1] = position[1] * 30; // 绿色通道 pixel[2] = position[0] + position[1] * 10; // 红色通道 }); std::cout << "多通道矩阵:\n" << mat << "\n\n"; // 分离通道处理 std::vector<cv::Mat> channels; cv::split(mat, channels); for (int i = 0; i < channels.size(); i++) { double minVal, maxVal; cv::Point minLoc, maxLoc; cv::minMaxLoc(channels[i], &minVal, &maxVal, &minLoc, &maxLoc); std::cout << "通道 " << i << ":\n"; std::cout << " 最小值: " << minVal << " 位置: (" << minLoc.x << ", " << minLoc.y << ")\n"; std::cout << " 最大值: " << maxVal << " 位置: (" << maxLoc.x << ", " << maxLoc.y << ")\n"; } return 0; } ``` ## 关键注意事项 1. **通道限制**: - `minLoc` 和 `maxLoc` 参数仅适用于**单通道**矩阵 - 对于多通道矩阵,需要先使用 `cv::split()` 分离通道再处理 2. **数据类型兼容性**: - 函数支持所有数值类型(`CV_8U`, `CV_32F` 等) - 对于浮点矩阵,位置信息仍以整数坐标返回 3. **掩码操作**: ```cpp cv::Mat mask = (mat > 50); // 创建大于50的掩码 cv::minMaxLoc(mat, &minVal, &maxVal, &minLoc, &maxLoc, mask); ``` 4. **仅获取值(忽略位置)**: ```cpp double min, max; cv::minMaxLoc(mat, &min, &max); ``` 5. **性能优化**: - 对于大型矩阵,处理前可降采样 - 使用 `cv::reduce()` 进行行/列级统计 ## 数学原理 `cv::minMaxLoc()` 函数高效实现的数学基础是分治策略: $$\text{minVal} = \min_{i,j} \text{src}(i,j)$$ $$\text{maxVal} = \max_{i,j} \text{src}(i,j)$$ 其中 $(i,j)$ 表示矩阵中的位置坐标。对于 $m \times n$ 矩阵,算法时间复杂度为 $O(mn)$[^4]。 ## 应用场景 1. 图像对比度分析 2. 特征点检测(如寻找最亮点) 3. 直方图均衡化的预处理 4. 图像二值化的阈值确定 5. 异常值检测
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值