Wyn*_*rix 7 c++ opencv colors pixels bgr
我正在使用C++和OpenCV创建一个函数,它将检测图像中像素的颜色,确定它所在的颜色范围,并用通用颜色替换它.例如,绿色可以从深绿色到浅绿色,程序将确定它仍然是绿色并用简单的绿色替换它,使输出图像看起来非常简单.一切都已设置,但我无法定义每个范围的特征,如果有人知道或者一个公式,给定BGR值,可以确定像素的整体颜色,这很奇怪.如果不是,我将不得不做很多实验,并自己做,但如果已经存在的东西,节省时间.我做了大量的研究,到目前为止还没有找到任何东西.
Mik*_*iki 16
如果你想让你的图像更简单(即颜色更少),但看起来很好看,你有几个选择:
一种简单的方法是将(整数除法)除以N图像的因子,然后乘以一个因子N.
或者,您可以K使用某些聚类算法(例如kmeans此处显示的聚合算法)或中值切割算法将图像划分为颜色.
原始图片:
减少颜色(量化N = 64):
减少颜色(聚集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;
}
Run Code Online (Sandbox Code Playgroud)
代码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;
}
Run Code Online (Sandbox Code Playgroud)
是的,“像素的整体颜色”可能指的是颜色的“色调”或“饱和度”。
因此,您需要一个将RGB转换为HSV(色调,饱和度,值)的公式,然后您只对色相或饱和度值感兴趣。
请参阅:将RGB转换为HSV和将HSV转换为RGB的算法,两者均在0-255范围内
编辑:您可能需要最大化饱和度,然后将其转换回RGB,并检查哪个值最高(例如(255,0,0)或(255,0,255)等)。
| 归档时间: |
|
| 查看次数: |
4338 次 |
| 最近记录: |