【4】opencv像素遍历的五种方法
#include <opencv2/opencv.hpp> #include <iostream> using namespace std; int main() { //这里png是四个通道,只是改掉其中的三个通道 cv::Mat MrMKG_0; MrMKG_0 = cv::imread("C:/Users/86136/Desktop/opencv学习/[004]像素遍历和访问/0001.png"); cv::namedWindow("图片输出样例"); cv::imshow("图片输出样例", MrMKG_0); cv::waitKey(10); //【1】下标M.at<float>(i,j) int i, j; for (i = 0;i < 1000; i++) { for (j = 0; j < 1000; j++) { MrMKG_0.at<cv::Vec3b>(i, j)[0] = 255; MrMKG_0.at<cv::Vec3b>(i, j)[0] = 0; MrMKG_0.at<cv::Vec3b>(i, j)[0] = 255; } } cv::namedWindow("图片输出样例"); cv::imshow("图片输出样例", MrMKG_0); cv::waitKey(90); /* 【2】利用指针(不熟) 这里所做到的是颜色反转 */ cv::Mat MrMKG_1 = MrMKG_0.clone(); int row = MrMKG_1.rows; int col = MrMKG_1.cols; int nStep = MrMKG_1.cols * MrMKG_1.channels(); for (int i = 0; i < row; i++) { uchar* pSrcData = MrMKG_0.ptr<uchar>(i); uchar* pResuiltData = MrMKG_1.ptr<uchar>(i); for (int j = 0; j < nStep; j++) { pResuiltData[j] = cv::saturate_cast<uchar>(255 - pSrcData[j]); //saturate_cast防溢出保护 } } cv::namedWindow("图片输出样例"); cv::imshow("图片输出样例", MrMKG_1); cv::waitKey(90); /* 【3】迭代器MatIterator_ 迭代器MatIterator_速度是五种方式里面的最慢的,操作方式比较复杂。不推荐使用。 (写这儿也就图一乐) */ cv::Mat temp = MrMKG_0.clone(); cv::MatConstIterator_<cv::Vec3b> srcIterStart = MrMKG_0.begin<cv::Vec3b>(); cv::MatConstIterator_<cv::Vec3b> srcIterEnd = MrMKG_0.end<cv::Vec3b>(); cv::MatIterator_<cv::Vec3b> resIterStart = temp.begin<cv::Vec3b>(); cv::MatIterator_<cv::Vec3b> resIterEnd = temp.end < cv::Vec3b > (); while (srcIterStart != srcIterEnd) { (*resIterStart)[0] = 255 - (*srcIterStart)[0]; (*resIterStart)[1] = 255 - (*srcIterStart)[1]; (*resIterStart)[2] = 255 - (*srcIterStart)[2]; srcIterStart++; resIterStart++; } /* 【4】isContinouous 应用于连续的图像 */ int row_1 = MrMKG_0.rows; int col_1 = MrMKG_0.cols; cv::Mat temp_1 = MrMKG_0.clone(); // 判断是否是连续图像,即是否有像素填充 if (MrMKG_0.isContinuous() && temp_1.isContinuous()) { row_1 = 1; // 按照行展开 col_1 = col_1 * MrMKG_0.rows * MrMKG_0.channels(); } // 遍历图像的每个像素 for (int i = 0; i < row_1; i++) { // 设定图像数据源指针及输出图像数据指针 const uchar* pSrcData = MrMKG_0.ptr<uchar>(i); uchar* pResultData = temp_1.ptr<uchar>(i); for (int j = 0; j < col; j++) { *pResultData++ = 255 - *pSrcData++; } } cv::namedWindow("图片输出样例"); cv::imshow("图片输出样例", temp_1); cv::waitKey(9000); //【5】LTU查表法(过几天学) }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!