我是openCV的初学者。我想画出R,G和B的强度分布图,如下图所示。我想在三个不同的图中绘制R、G和B值w.r.t到像素位置。到目前为止,我已经学会了如何读取和显示图像。例如使用imread();
Mat img = imread("Apple.bmp");
然后使用imshow(“Window”,img)将其显示在屏幕上;。现在,我想把所有的R,G和B值在3个单独的缓冲区; buf 1、buf 2、buf 3,并绘制这些值。请给我一些提示或示例代码片段,以帮助我理解这一点。
dffbzjpn1#
您可以使用cv::split()将R、G和B分离到单独的垫子中
cv::split()
std::vector<Mat> planes(3); cv::split(img, planes); cv::Mat R = planes[2]; cv::Mat G = planes[1]; cv::Mat B = planes[0];
但是如果你的代码需要一个只有一个颜色通道的Mat,你只需要像这样把它们分开。不要使用at<>()作为所谓的重复建议--如果你顺序扫描图像,它会非常慢(但是它对随机访问很好)。您可以像这样高效地扫描图像
at<>()
for(int i = 0; i < img.rows; ++i) { // get pointers to each row cv::Vec3b* row = img.ptr<cv::Vec3b>(i); // now scan the row for(int j = 0; j < img.cols; ++j) { cv::Vec3b pixel = row[j]; uchar r = pixel[2]; uchar g = pixel[1]; uchar b = pixel[0]; process(r, g, b); } }
最后,如果你想做一个直方图,你可以使用这个代码。它是相当老,所以我想它仍然工作。
void show_histogram_image(cv::Mat src, cv::Mat &hist_image) { // based on http://docs.opencv.org/2.4.4/modules/imgproc/doc/histograms.html?highlight=histogram#calchist int sbins = 256; int histSize[] = {sbins}; float sranges[] = { 0, 256 }; const float* ranges[] = { sranges }; cv::MatND hist; int channels[] = {0}; cv::calcHist( &src, 1, channels, cv::Mat(), // do not use mask hist, 1, histSize, ranges, true, // the histogram is uniform false ); double maxVal=0; minMaxLoc(hist, 0, &maxVal, 0, 0); int xscale = 10; int yscale = 10; //hist_image.create( hist_image = cv::Mat::zeros(256, sbins*xscale, CV_8UC3); for( int s = 0; s < sbins; s++ ) { float binVal = hist.at<float>(s, 0); int intensity = cvRound(binVal*255/maxVal); rectangle( hist_image, cv::Point(s*xscale, 0), cv::Point( (s+1)*xscale - 1, intensity), cv::Scalar::all(255), CV_FILLED ); } }
1条答案
按热度按时间dffbzjpn1#
您可以使用
cv::split()
将R、G和B分离到单独的垫子中但是如果你的代码需要一个只有一个颜色通道的Mat,你只需要像这样把它们分开。不要使用
at<>()
作为所谓的重复建议--如果你顺序扫描图像,它会非常慢(但是它对随机访问很好)。您可以像这样高效地扫描图像
最后,如果你想做一个直方图,你可以使用这个代码。它是相当老,所以我想它仍然工作。