Возьмите среднее значение цвета каждого столбца изображения, используя OpenCV с C в Visual Studio 2019

#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! Помогает мне