Recherche…


Définir l'image entière sur une couleur unie

Étant donné une taille de cv::Mat img non vide, nous pouvons la remplir de plusieurs manières:

img = cv::Scalar(blueVal,greenVal,redVal);

ou, plus général, mask support, cv::Mat::setTo() :

img.setTo(cv::Scalar(blueVal,greenVal,redVal));

Si vous utilisez l'ancienne API OpenCV C avec IplImage* img :

Utilisation:

cvSet(img, CV_RGB(redVal,greenVal,blueVal));

Modification des pixels par pixel des images

Dans OpenCV, les images peuvent être RVB / BGR, HSV, niveaux de gris, noir et blanc, etc. Il est essentiel de connaître le type de données avant de traiter les images.

Les types de données d'image sont principalement CV_8UC3 (matrice de uchar à 3 canaux) et CV_8U (matrice de uchar à 1 canal), mais la conversion à d'autres types tels que CV_32FC3, CV_64F est également possible. (voir types de données )

Considérez que l'image est une image RVB qui est lue par la fonction de imread .

Mat rgb = imread('path/to/rgb/image', CV_LOAD_IMAGE_COLOR);
//to set RED pixel value of (i,j)th to X,
rgb.at<Vec3b>(i,j)[0] = X;

De même, si l'image est en niveaux de gris,

gray.at<uchar>(i,j) = X;

Notez que, dans OpenCV, les images en noir et blanc sont stockées en tant que type CV_8U avec les valeurs 0 et 255. Par conséquent, la modification des images BW est identique à celle des images grises.

Modification de la couleur de l’image dans OpenCV - kmeans (). Pour analyser tous les pixels d'une image et remplacer les valeurs de pixels par des couleurs génériques.

#include opencv2/opencv.hpp> #include vector> using namespace std; using namespace cv; int main() { Mat3b img = imread("test.jpg"); imshow("Original", img); // Cluster int K = 8; int n = img.rows * img.cols; Mat data = img.reshape(1, n); data.convertTo(data, CV_32F); Mat labels; Mat1f colors; kmeans(data, K, labels, cv::TermCriteria(), 1, cv::KMEANS_PP_CENTERS, colors); for (int i = 0; i < n; ++i) { data.at<float>(i, 0) = colors(labels.at<int>(i), 0); data.at<float>(i, 1) = colors(labels.at<int>(i), 1); data.at<float>(i, 2) = colors(labels.at<int>(i), 2); } Mat reduced = data.reshape(3, img.rows); reduced.convertTo(reduced, CV_8U); imshow("Reduced", reduced); waitKey(0); return 0;
imshow("Original", img);

// Cluster

int K = 8;
int n = img.rows * img.cols;
Mat data = img.reshape(1, n);
data.convertTo(data, CV_32F);

Mat labels;
Mat1f colors;
kmeans(data, K, labels, cv::TermCriteria(), 1, cv::KMEANS_PP_CENTERS, colors);

for (int i = 0; i < n; ++i)
{
    data.at<float>(i, 0) = colors(labels.at<int>(i), 0);
    data.at<float>(i, 1) = colors(labels.at<int>(i), 1);
    data.at<float>(i, 2) = colors(labels.at<int>(i), 2);
}

Mat reduced = data.reshape(3, img.rows);
reduced.convertTo(reduced, CV_8U);



imshow("Reduced", reduced);
waitKey(0);

return 0;

}



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow