Normaliser les canaux de couleur d'une image en fonction de l'intensité des valeurs, OpenCV

J'ai découper une image en 3 couches de couleur - un bleu, un vert et un rouge. Je tiens à normaliser chacun de ces canaux par l'image de l'intensité, où l'intensité = (rouge + bleu + vert)/3. Pour être clair, je suis en train de faire une image qui est composée de l'un des trois canaux de couleur, divisé par l'image de l'intensité, où l'intensité est décrit par l'équation ci-dessus.
Je suis nouveau sur OpenCV et je ne pense pas que je le fais correctement; lorsque les images sont affichées, tous les pixels apparaissent en noir.
Je suis nouveau sur OpenCV (j'ai travaillé à travers les tutoriels qui viennent avec la documentation, mais c'est tout) - des conseils sur la façon d'aller sur cette normalisation pourrait être extrêmement utile.

Merci!

Voici ma tentative:

int main(int argc, char** argv){
Mat sourceImage, I;
const char* redWindow = "Red Color Channel";
const char* greenWindow = "Green Color Channel";
const char* blueWindow = "Blue Color Channel";


if(argc != 2)
{
  cout << "Incorrect number of arguments" << endl;
}
/* Load the image */
sourceImage = imread(argv[1], 1);
if(!sourceImage.data)
{
  cout << "Image failed to load" << endl;
}

/* First, we have to allocate the new channels */
Mat r(sourceImage.rows, sourceImage.cols, CV_8UC1);
Mat b(sourceImage.rows, sourceImage.cols, CV_8UC1);
Mat g(sourceImage.rows, sourceImage.cols, CV_8UC1);

/* Now we put these into a matrix */
Mat out[] = {b, g, r};

/* Split the image into the three color channels */
split(sourceImage, out);

/* I = (r + b + g)/3  */
add(b, g, I);
add(I, r, I);
I = I/3;

Mat red = r/I;
Mat blue = b/I;
Mat green = g/I;

/* Create the windows */
namedWindow(blueWindow, 0);
namedWindow(greenWindow, 0);
namedWindow(redWindow, 0);

/* Show the images */
imshow(blueWindow, blue);
imshow(greenWindow, green);
imshow(redWindow, red);

waitKey(0);
return 0;
}
  • 1. vous n'avez pas besoin de pré-allocation des canaux utilisés dans la fonction split() (ils vont se realloced/écrasé de toute façon) 2. quelque chose comme r/je souffre d'une division entière 3. n'#t le faire dans l'espace rvb, convertir vhs, split,manipuler h seulement, de fusionner, de se reconvertir en rgb
  • Merci! Ok, je me suis débarrassé de la pré-affectation, et j'ai utilisé la fonction de division au lieu de '/' (est-ce mieux?). Aussi, pouvez-vous expliquer un peu plus ce que tu veux dire par manipuler h seulement?
  • diviser c'est la même chose que /. et désolé pour mon sloppyness, - je dû poser la question avant, ce que vous essayez d'atteindre par cette normalisation ?
  • Pas de soucis - je suis en train de mettre en œuvre une base saillants de l'objet de l'algorithme de détection. En tant que tel, l'une des principales région qui en contiennent le moins probable de la valeur de r, g ou b canaux de couleur
  • Afin de normaliser chacun des canaux signifie que certaines zones semblent plus brillants sur l'un des normalisé canaux. (théoriquement, au moins autant que je le comprends)
  • ahh, voir, source de malentendus, - j'ai été plus penser en termes de péréquation. mais encore une fois, si vous voulez diviser, vous avez probablement besoin de convertir les chaînes à virgule flottante en premier. d'autre vous rencontrez des problèmes comme: 7/12 (c'est 0 avec des entiers/char)
  • Bien, merci, un autre bon point!
  • Est-il possible que vous pourriez nous expliquer un peu plus ce que tu veux dire par manipuler h seulement?
  • encore une fois, c'était plus fait référence à une égalisation de problème, et j'ai même été trompé, si vous le convertissez en vhs (ou de laboratoire), vous pouvez normaliser v seulement pour obtenir une égalisation de la luminosité/intensité. de nouveau, probablement pas exactement ce que vous êtes après.
  • Ok un grand merci!
  • c'est ce que j'ai confondu votre problème: stackoverflow.com/questions/24341114/...

InformationsquelleAutor Nathan | 2014-06-25