OpenCV读取图片,求RGB通道各像素点Max和Min
#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
using namespace cv;
cv::Mat calcMax(const cv::Mat& bgr)
{
cv::Mat image(bgr.rows, bgr.cols, CV_8UC1, cv::Scalar(255));
if (bgr.channels() != 3)
{
return bgr;
}
uchar max = 0;
uchar* pSrc = nullptr;
uchar* pDst = image.data;
for (int y = 0; y < bgr.rows; y++)
{
pSrc = bgr.data + y * bgr.step;
for (int x = 0; x < bgr.cols; x++)
{
max = 0;
for (int v = 0; v < 3; v++)
{
if (pSrc[v] > max)
{
max = pSrc[v];
}
}
pSrc += 3;
pDst[y * bgr.cols + x] = max;
}
}
return image;
}
cv::Mat calcMin(const cv::Mat& bgr)
{
cv::Mat image(bgr.rows, bgr.cols, CV_8UC1, cv::Scalar(255));
if (bgr.channels() != 3)
{
return bgr;
}
uchar min = 255;
uchar* pSrc = nullptr;
uchar* pDst = image.data;
for (int y = 0; y < bgr.rows; y++)
{
pSrc = bgr.data + y * bgr.step;
for (int x = 0; x < bgr.cols; x++)
{
min = 255;
for (int v = 0; v < 3; v++)
{
if (pSrc[v] < min)
{
min = pSrc[v];
}
}
pSrc += 3;
pDst[y * bgr.cols + x] = min;
}
}
return image;
}
int main(int argc, char* argv[])
{
std::string pattern = "0.jpg";
std::vector< String > filePaths;
glob(pattern, filePaths, false);
ofstream outRGBmax("RGBmax.txt");
ofstream outRGBmin("RGBmin.txt");
for (int i = 0; i < filePaths.size(); i++)
{
std::string filePath = filePaths[i];
cv::Mat imageRaw = cv::imread(filePath, IMREAD_COLOR);
cv::Mat imageGray1;
cv::Mat imageGray2;
cv::Mat imageGray3;
cv::cvtColor(imageRaw, imageGray1, COLOR_RGB2GRAY);
imageGray2 = calcMax(imageRaw);
imageGray3 = calcMin(imageRaw);
outRGBmax << imageGray2 << endl;
outRGBmin << imageGray3 << endl;
}
outRGBmax.close();
outRGBmin.close();
printf(" OK ! \n");
return 0;
}