【问题标题】:Restore contrast of image after modifying it in Android or OpenCV在 Android 或 OpenCV 中修改图像后恢复图像对比度
【发布时间】:2017-07-06 11:42:31
【问题描述】:

我正在使用更改对比度的图像,但我不知道如何在先修改图像后恢复图像的对比度。

我理解大于 1 的值会增加对比度,而介于 0 和 1 之间的值会降低对比度。

我尝试使用OpenCV 和ColorMatrix 中的Android。

例如,使用OpenCV,首先我将图像的对比度加倍,如下所示:

src.convertTo(dst, -1, 2, 0);

然后我把它减半:

src.convertTo(dst, -1, 0.5, 0);

但是在降低它之后,生成的图像与我在加倍对比度之前的原始图像不同。

使用Android,我使用这个颜色矩阵来加倍对比度:

ColorMatrix cm = new ColorMatrix();
        cm.set(new float[] {
                2, 0, 0, 0, 0,
                0, 2, 0, 0, 0,
                0, 0, 2, 0, 0,
                0, 0, 0, 1, 0});

这会减少一半:

ColorMatrix cm = new ColorMatrix();
        cm.set(new float[] {
                0.5, 0, 0, 0, 0,
                0, 0.5, 0, 0, 0,
                0, 0, 0.5, 0, 0,
                0, 0, 0, 1, 0});

我在互联网上尝试了不同的值和研究,但我无法弄清楚增加和减少对比度之间的等价性。

有人知道怎么做吗?

【问题讨论】:

  • 如果不简单地恢复到图像备份,我会说它是不可逆的
  • 我也想到了这一点,但后来我检查了 Instagram 或 Google Photos 等应用程序,它们有一个可以修改对比度的栏,看起来很流畅,让我觉得这是可能的
  • 可能每次调用新设置都是从​​原始的新副本开始
  • convertTo 使结果饱和。对于 8 位无符号值的矩阵,这意味着当您乘以 2 时,所有大于等于 128 的值都变为 255。恕我直言,当您不了解数据类型或行为时,开发功能软件的希望很小您正在使用的功能。

标签: android image opencv contrast colormatrix


【解决方案1】:

您好,您可以使用以下方法更改对比度

  /**
     * Set contrast and brightness in bitmap
     *
     * @param bmp        bitmap to change
     * @param contrast   contrast value from 1 to 10
     * @param brightness brightness value from 1 to 100
     * @return tuned bitmap
     */
    public static Bitmap ChangeBitmapContrastBrightness(Bitmap bmp, float contrast, float brightness) {
        ColorMatrix cm = new ColorMatrix(new float[]
                {
                        contrast, 0, 0, 0, brightness,
                        0, contrast, 0, 0, brightness,
                        0, 0, contrast, 0, brightness,
                        0, 0, 0, 1, 0
                });

        Bitmap ret = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());

        Canvas canvas = new Canvas(ret);

        Paint paint = new Paint();
        paint.setColorFilter(new ColorMatrixColorFilter(cm));
        canvas.drawBitmap(bmp, 0, 0, paint);

        return ret;
    }

【讨论】:

  • 由于图像本身正在被修改,您无法获得确切的原始图像
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 2016-09-19
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多