是否有一个公式来确定给定BGR值的整体颜色? (OpenCV和C ++)
我正在使用C ++和OpenCV函数来检测图像中像素的颜色,确定它所在的颜色范围,并用通用颜色replace它。 例如,绿色可以从深绿色到浅绿色,程序会确定它仍然是绿色的,并用简单的绿色代替它,使得输出图像看起来非常简单。 一切都设置好了,但是我很难定义每个范围的特性,并且如果有人知道,或者给定BGR值的公式可以确定一个像素的整体颜色,那么我很好奇。 如果没有,我将不得不做很多的实验,并自己做,但如果已经存在,可以节省时间。 我做了大量的研究,到目前为止还没有发现任何东西。
如果你想让你的图像更简单 (即用更less的颜色),但好看,你有几个select:
-
一个简单的方法是将整数除以图像的因子
N
,然后乘以因子N
-
或者,您可以使用某些聚类algorithm(如此处显示的
kmeans
或中值切割algorithm将图像分成K
颜色。
原始图像:
减less颜色(量化, N = 64
):
减less颜色(聚集, K = 8
):
代码量化:
#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; }
代码kmeans:
#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; }
是的,“像素的整体颜色”可能是指颜色的“色调”或“饱和度”。
所以你需要一个将RGB转换成HSV(色调,饱和度,值)的公式,然后你只会对色调或饱和度值感兴趣。
请参阅: algorithm将RGB转换为HSV,HSV转换为RGB,范围0-255
编辑:您可能需要最大化饱和度,然后将其转换回RGB,并检查哪个值是最高的(例如(255,0,0)或(255,0,255)等)。
如果要访问所有像素的RGB值,那么下面是代码,
#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); } } }