OpenCV像素化算法

时间:2015-10-12 02:57:41

标签: c++ opencv pixelate

大家。

我想知道我正在研究的像素化算法是否有任何改进。

使用OpenCV库在C ++中编写的算法,其工作原理如下:

  • 稍微增加Mat的对比度;
  • 使用 n 最近 - n eighbor i nterpolation,将Mat的大小调整为<​​strong> D %的大小;
  • 使用 nni ;
  • 将垫子调整回原始尺寸

[ D =密度,函数的参数]

有没有办法让结果看起来更好?

Mat pixelize(Mat src, int density){
    Size s(src.cols, src.rows);

    src.convertTo(src, -1, 1.1, 0);

    resize(src, src, percent(s, density), 1, 1, INTER_NEAREST);
    resize(src, src, s, 1, 1, INTER_NEAREST);

    resize(src, src, Size(640, 480));
    return src;
}

1 个答案:

答案 0 :(得分:1)

2年零9个月后,但我认为值得分享,我使用像素化图像的方式是这样的:

int size = 7;//only odd!
int max_step = (size - 1) / 2;
Mat m = imread("test.jpg");
for (int i = max_step; i < m.rows- max_step; i+=size) {
    for (int j = max_step; j < m.cols- max_step; j+=size) {
        Vec3b colour = m.at<Vec3b>(Point(j, i));
        for (int k = -max_step; k <= max_step; k++) {
            for (int l = -max_step; l <= max_step; l++) {
                m.at<Vec3b>(Point(j - k, i - l)) = colour;
            }
        }
    }
}
imshow("pixeled", m);
waitKey(0);

通过这种方法,您可以每奇数个像素(尺寸可变)移动并使用与所选颜色相同的颜色围绕其近邻。

请注意,这不能处理边缘,但是您可以了解这种算法

在这里,我留下了一些images,它们的参数分别为1(无),7(中)和21(非常)。 为了改善性能,您可以选择“ size”变量来改变抽象参数的功能和图像的大小……嗯,希望对您有所帮助,甚至晚了将近3年!