opencv
Modyfikacja zawartości obrazu
Szukaj…
Ustaw cały obraz na jednolity kolor
Biorąc pod uwagę niepuste zdjęcie cv::Mat img o pewnym rozmiarze, możemy wypełnić go jednolitym kolorem na kilka sposobów:
img = cv::Scalar(blueVal,greenVal,redVal);
lub, bardziej ogólnie, obsługa masek, cv::Mat::setTo() :
img.setTo(cv::Scalar(blueVal,greenVal,redVal));
Jeśli używasz starszego API OpenCV C z IplImage* img :
Posługiwać się:
cvSet(img, CV_RGB(redVal,greenVal,blueVal));
Modyfikacja obrazów piksel po pikselu
W OpenCV obrazy mogą być RGB / BGR, HSV, w skali szarości, czarno-białe i tak dalej. Ważne jest, aby znać typ danych przed rozpoczęciem pracy z obrazami.
Typami danych obrazu są głównie CV_8UC3 (macierz uchar z 3 kanałami) i CV_8U (matryca uchar z 1 kanałem), jednak możliwa jest również konwersja na inne typy, takie jak CV_32FC3, CV_64F. (patrz typy danych )
Zastanów się, obraz jest obrazem RGB, który jest odczytywany przez imread funkcji.
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;
Podobnie, jeśli obraz jest w skali szarości,
gray.at<uchar>(i,j) = X;
Zauważ, że w OpenCV obrazy czarno-białe są zapisywane jako typ CV_8U o wartościach 0 i 255. Dlatego zmienianie obrazów BW jest takie samo jak obrazy szare.
Zmiana koloru obrazu w OpenCV - kmeans (). Aby zeskanować wszystkie piksele obrazu i zastąpić wartości pikseli ogólnymi kolorami.
#include opencv2/opencv.hpp> #include vector> using namespace std; using namespace cv; int main() { Mat3b img = imread("test.jpg"); z } 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;
#include opencv2/opencv.hpp> #include vector> using namespace std; using namespace cv; int main() { Mat3b img = imread("test.jpg"); z }