#c #visual-studio #opencv #pixel #iostream
#c #visual-studio #opencv #пиксель #iostream
Вопрос:
Я новичок в использовании C , и мне нужно вычислить среднее значение красного цвета в каждом столбце. Впоследствии мне нужно составить график уровня плотности цвета для каждого столбца.
Это изображение, которое я использую, представляет собой образец плотности кости:
Пока это мой код:
#include <opencv2/opencv.hpp>
#include <string>
#include <vector>
#include <iostream>
#include <windows.h>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
FARPROC pGetPixel;
std::cout << "Medidas de muestra 1: n";
Mat img = imread("C:\Users\Jimena G. Gordillo\OneDrive\Pictures\den.bmp");
int matriz = img.cols * img.rows * 3;
const size_t chanels = 3; //RGB
//Lectura de cada pixel
for (int x = 0; x < img.cols; x ) {
for (int y = 0; y < img.rows; y ) {
size_t p = y * img.cols * chanels x * chanels; //
uchar b = img.data[p 0];
uchar g = img.data[p 1];
uchar r = img.data[p 2];
for (int i = 0; i <= img.cols; i ) { //here is where I want to obtain the sum of each column
int sum = sum i;
//Calculate average
long long average = sum / img.rows; // average is divided by the total of rows
}
}
}
cout << "Filas: " << img.rows<< endl;
cout << "Columnas: " << img.cols << endl;
cout << "Area: " << matriz << endl;
namedWindow("imagen", WINDOW_AUTOSIZE);
imshow("imagen", img);
waitKey();
return 0;
}
Любая помощь приветствуется.
Комментарии:
1. С какими проблемами вы в настоящее время сталкиваетесь при реализации своего решения? Каков ваш текущий результат по сравнению с желаемым? Можете ли вы подробнее рассказать о графике, который вам нужно вычислить?
Ответ №1:
Вы пытаетесь проверять строку за строкой, а не столбец за столбцом, и третий цикл for не нужен.
Вот решение для каждого канала (красное, зеленое, синее) среднее значение столбцов и график средних значений столбцов для каждого канала.
Источник:
График красного канала для каждого среднего значения столбца:
График зеленого канала для каждого среднего значения столбца:
График синего канала для каждого среднего значения столбца:
Код:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("/ur/source/image/directory/img.png");
imshow("Source",img);
long int avgRedChannel = 0,avgGreenChannel = 0, avgBlueChannel = 0;
Mat graphRedChannel = Mat::zeros(Size(img.cols,300),CV_8UC1);
Mat graphGreenChannel = Mat::zeros(Size(img.cols,300),CV_8UC1);
Mat graphBlueChannel = Mat::zeros(Size(img.cols,300),CV_8UC1);
for(int i=0;i<img.cols;i )
{
for(int j=0;j<img.rows;j )
{
avgBlueChannel = (int)img.at<Vec3b>(Point(i,j))[0];
avgGreenChannel = (int)img.at<Vec3b>(Point(i,j))[1];
avgRedChannel = (int)img.at<Vec3b>(Point(i,j))[2];
}
graphBlueChannel.at<uchar>(Point(i,(avgBlueChannel/img.rows))) = 255;
graphGreenChannel.at<uchar>(Point(i,(avgGreenChannel/img.rows))) = 255;
graphRedChannel.at<uchar>(Point(i,(avgRedChannel/img.rows))) = 255;
avgBlueChannel = 0;
avgGreenChannel = 0;
avgRedChannel = 0;
}
imshow("RedChannelGraph",graphRedChannel);
imshow("GreenChannelGraph",graphGreenChannel);
imshow("BlueChannelGraph",graphBlueChannel);
waitKey(0);
return(0);
}
Комментарии:
1. Спасибо за отзыв, @YunusTemurlenk! Помогает мне