tarjeta - ¿Existe una fórmula para determinar el color general dados los valores de BGR?(OpenCV y C++)
pago matricula visa bgr (3)
Sí, lo que probablemente quiere decir con "Color general de un píxel" es el "Tono" o la "Saturación" del color.
Entonces, desea una fórmula que transforme RGB a HSV (tono, saturación, valor), y luego solo le interesarán los valores de tono o saturación.
Ver: Algoritmo para convertir RGB a HSV y HSV a RGB en el rango 0-255 para ambos
EDITAR: es posible que deba maximizar la saturación y luego convertirla nuevamente a RGB e inspeccionar qué valor es el más alto (por ejemplo (255,0,0) o (255,0,255), etc.
Estoy haciendo una función usando C ++ y OpenCV que detectará el color de un píxel en una imagen, determinará en qué rango de color está y lo reemplazará con un color genérico. Por ejemplo, el verde podría variar de verde oscuro a verde claro, el programa determinaría que todavía es verde y lo reemplazaría con un verde simple, haciendo que la imagen de salida tenga un aspecto muy simple. todo está configurado, pero tengo problemas para definir las características de cada rango y tenía curiosidad si alguien sabe o una fórmula que, dados los valores de BGR, podría determinar el color general de un píxel. Si no, tendré que experimentar mucho y hacerlo yo mismo, pero si ya existe algo, ahorraría tiempo. He investigado mucho y hasta ahora no he encontrado nada.
Si desea acceder al valor RGB de todos los píxeles, a continuación se muestra el código,
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat image = imread("image_path");
for(int row = 1; row < image.rows; row++)
{
for(int col = 1; col < image.cols; col++)
{
Vec3b rgb = image.at<Vec3b>(row, col);
}
}
}
Si desea simplificar su imagen (es decir, con menos colores), pero bien parecido, tiene algunas opciones:
-
Un enfoque simple sería dividir ( división de enteros ) por un factor
N
la imagen, y luego multiplicar por un factorN
-
O puede dividir su imagen en
K
colores, utilizando un algoritmo de agrupación comokmeans
muestra aquí, o un algoritmo de corte medio.
Imagen original:
Colores reducidos (cuantizados,
N = 64
):
Colores reducidos (agrupados,
K = 8
):
Cuantificación de código:
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat3b img = imread("path_to_image");
imshow("Original", img);
uchar N = 64;
img /= N;
img *= N;
imshow("Reduced", img);
waitKey();
return 0;
}
Código k significa:
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat3b img = imread("path_to_image");
imshow("Original", img);
// Cluster
int K = 8;
int n = img.rows * img.cols;
Mat data = img.reshape(1, n);
data.convertTo(data, CV_32F);
vector<int> 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[i], 0);
data.at<float>(i, 1) = colors(labels[i], 1);
data.at<float>(i, 2) = colors(labels[i], 2);
}
Mat reduced = data.reshape(3, img.rows);
reduced.convertTo(reduced, CV_8U);
imshow("Reduced", reduced);
waitKey();
return 0;
}