【发布时间】:2017-03-02 21:05:00
【问题描述】:
我正在尝试使用此公式将灰度图像颜色从 256 降低到 4 来自http://docs.opencv.org/2.4/doc/tutorials/core/how_to_scan_images/how_to_scan_images.html
我假设 n 是减少因子,对于这种情况,它将是公式中的 10 种颜色。 我的代码如下。
void Reduction(Mat image1)
{
for (int r = 0;r < image1.rows;r++) {
for (int c = 0;c < image1.cols;c++) {
// get pixel
int tmp = (image1.at<Vec3b>(r, c)[0] + image1.at<Vec3b>(r, c)[1] + image1.at<Vec3b>(r, c)[2])/3 ;
tmp = (tmp/4)* 4;
image1.at<Vec3b>(r, c)[0] = tmp;
image1.at<Vec3b>(r, c)[1] = tmp;
image1.at<Vec3b>(r, c)[2] = tmp;
}
}
}
但是从 tmp = (tmp/4)*4;或 tmp = (tmp/8)*8;
然后我尝试将其更改为 tmp = (tmp/40)*40;
公式是如何工作的,我应该从我的代码中编辑什么来准确地得到我想要的结果? (就像上面的预期结果)
【问题讨论】:
-
(tmp / 4) * 4)从 256 种颜色减少到 64 种颜色。(tmp / 8) * 8)从 256 种颜色减少到 32 种颜色。等等。您的原始公式(tmp / 10) * 10)正在从 256 种颜色减少到 25 种颜色。这是如何运作的?在第一种情况下,颜色4 5 6 7变为1 1 1 1,然后变为4 4 4 4,因为整数除法。 -
不要垃圾标签! C 和 C++ 是不同的语言。
-
更好的方法是使用舍入。颜色减少算法有据可查。应该有大量信息可以找到它们如何运行以及哪些算法最适合。
-
@WeatherVane 谢谢你的解释。现在对整数除法有了更好的理解
-
如果您不想要类似卡通的输出,我会使用带有常量预定义调色板的simple Dithering in C++。只是
r,g,b只计算intensity所以几乎2/3的代码将消失。
标签: c++ algorithm opencv colors