如何在Java中将灰度图像蒙版应用于RGB图像

伊万·佩拉雷斯M.

建议我将这个问题与另一个问题分开。这是原始文件:

如何将白色背景更改为黑色

经过一些图像处理后,我得到了一个二进制图像,但是边界是如此的硬,所以我应用了一个高斯滤波器来获得一个柔和的滤波器。结果是灰度图像。我需要将此图像用作另一个蒙版的遮罩,因为它们都没有alpha通道,因此需要在没有该值的情况下进行颜色混合。我正在使用Marvin Framework来完成这项工作,但Marvin没有插件,因此我编写了一个,就是这样:

@Override public void process(MarvinImage _imageIn, MarvinImage _imageOut, MarvinAttributes attrOut, MarvinImageMask _mask, boolean previewMode) {

    MarvinImage mask = _imageIn;
    MarvinImage image = _imageOut;

    for(int y=0; y<mask.getHeight(); y++){
        for(int x=0; x<mask.getWidth(); x++){

            //ya que está en grayscale, los 3 valores son los mismos
            int r1 = mask.getIntComponent0(x, y);
            int g1 = mask.getIntComponent1(x, y);
            int b1 = mask.getIntComponent2(x, y);

            int r2 = image.getIntComponent0(x, y);
            int g2 = image.getIntComponent1(x, y);
            int b2 = image.getIntComponent2(x, y);

            //al color de salida, le asignamos la luminicencia de la imagen mascara
            int r = 0, g = 0, b = 0;
            if(r1 > 0 || r2 > 0){
                r = r1*r2/Math.max(r1, r2);
            }

            if(g1 > 0 || g2 > 0){
                g = g1*g2/Math.max(g1, g2);
            }

            if(b1 > 0 || b2 > 0){
                b = b1*b2/Math.max(b1, b2);
            }

            image.setIntColor(x, y, r, g, b);
        }
    }
}

但是这段代码有一个我无法解决的小错误。当rgb图像为白色时,颜色效果不会很好地结合在一起,并且不会变暗。我正在寻找的是可以使用gimp实现的东西,其中有2层图像,最下面的是rgb图像,最上面的是灰度蒙版,然后在这一层中,我们将功能color转换为alpha,使用白色为目标。结果是下一个:

金普混合

该算法是下一个:

算法组合

区别非常明显。这是用于测试的两个原始图像:

彩色图像
(来源:imgsafe.org

灰度蒙版

加布里埃尔·安布罗西奥·阿坎乔(GabrielAmbrósioArchanjo)

您只需要对图像和遮罩进行alpha组合。基本上,输出图像像素为:

output_image(x,y)= input_image(x,y)* PI + mask_image(x,y)* PM

其中PI和PM分别是输入像素和蒙版图像在输出像素中的百分比。PI + PM = 1(100%)

例子:

对于蒙版中的黑色像素:

PM = 1-(灰度像素/ 255)→1-(0/255)= 1

对于白色像素:

PM = 1-(灰度像素/ 255)→1-(255/255)= 0

对于灰色像素:

PM = 1-(灰度像素/ 255)→1-(127/255)= 0.5

最后:

PI = 1-PM;

输出1:

在此处输入图片说明

源代码:

public class GrayScaleMask {

    public GrayScaleMask(){

        MarvinImage image = MarvinImageIO.loadImage("./res/grayscaleMask_input.png");
        MarvinImage mask = MarvinImageIO.loadImage("./res/grayscaleMask_mask.png");
        grayscaleMask(image.clone(), image, mask);
        MarvinImageIO.saveImage(image, "./res/grayscaleMask_output.png");
    }

    private void grayscaleMask(MarvinImage image, MarvinImage imageOut, MarvinImage mask){
        int r1,r2,g1,g2,b1,b2;
        double maskGray, factorMask, factorImage;
        for(int y=0; y<image.getHeight(); y++){
            for(int x=0; x<image.getWidth(); x++){
                r1 = image.getIntComponent0(x, y);
                g1 = image.getIntComponent1(x, y);
                b1 = image.getIntComponent2(x, y);
                r2 = mask.getIntComponent0(x, y);
                g2 = mask.getIntComponent1(x, y);
                b2 = mask.getIntComponent2(x, y);
                maskGray = (r2*0.21)+(g2*0.72)+(b2*0.07);
                factorMask = 1-(maskGray/255);
                factorImage = 1-factorMask;
                imageOut.setIntColor(x, y,  (int)(r1*factorImage+r2*factorMask),
                                            (int)(g1*factorImage+g2*factorMask),
                                            (int)(b1*factorImage+b2*factorMask));

            }
        }
    }

    public static void main(String[] args) {
        new GrayScaleMask(); System.exit(0);
    }
}

输出2:

您可以在合并面膜之前将其变暗:

    r2 = (int)(r2*0.3);
    g2 = (int)(g2*0.3);
    b2 = (int)(b2*0.3);
    imageOut.setIntColor(x, y,  (int)((r1*factorImage+r2*factorMask)),
                                (int)((g1*factorImage+g2*factorMask)),
                                (int)((b1*factorImage+b2*factorMask)));

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Java中将灰度图像蒙版应用于RGB图像

来自分类Dev

如何将蒙版应用于保存图像 (swift3)

来自分类Dev

使用numpy将二进制蒙版应用于RGB图像时出现问题

来自分类Dev

使用imagemagick将垫调整大小的蒙版应用于裁切大小的图像

来自分类Dev

将响应式SVG图像蒙版应用于HTML5视频

来自分类Dev

如何在OpenCV中将灰度图像复制到RGB图像红色通道?

来自分类Dev

如何在KonvaJS中将过滤器应用于具有图像填充的形状?

来自分类Dev

如何在dynamicjs中将遮罩应用于填充有图像对象的矩形

来自分类Dev

将CSS灰度属性应用于图像

来自分类Dev

将CSS色相旋转滤镜应用于灰度图像

来自分类Dev

将自适应阈值应用于灰度图像

来自分类Dev

如何融合图像蒙版?

来自分类Dev

如何在图像上应用灰度滤镜?

来自分类Dev

在Python中将RGB图像转换为灰度

来自分类Dev

MATLAB:在RGB图像上应用透明蒙版并与另一个蒙版混合

来自分类Dev

MATLAB:在RGB图像上应用透明蒙版并与另一个蒙版混合

来自分类Dev

如何在图像上制作圆形蒙版

来自分类Dev

如何在图像上使用CSS蒙版?

来自分类Dev

如何在不将转换应用于其蒙版的情况下在Snap.svg中转换形状?

来自分类Dev

将归一化应用于RGB图像并获取RGB图像作为输出

来自分类Dev

在OpenCV中将Alpha通道应用于图像的最快方法

来自分类Dev

如何在OpenCV Java中将二进制图像转换为灰度

来自分类Dev

如何在OpenCV Java中将二进制图像转换为灰度

来自分类Dev

如何调整图像分割蒙版的大小?

来自分类Dev

如何使图像蒙版显示在悬停上

来自分类Dev

如何将Alpha蒙版应用于Android可绘制对象?

来自分类Dev

将函数应用于蒙版的numpy数组

来自分类Dev

调用熊猫将函数应用于蒙版的结果

来自分类Dev

将Alpha蒙版应用于OpenGL中的视频

Related 相关文章

  1. 1

    如何在Java中将灰度图像蒙版应用于RGB图像

  2. 2

    如何将蒙版应用于保存图像 (swift3)

  3. 3

    使用numpy将二进制蒙版应用于RGB图像时出现问题

  4. 4

    使用imagemagick将垫调整大小的蒙版应用于裁切大小的图像

  5. 5

    将响应式SVG图像蒙版应用于HTML5视频

  6. 6

    如何在OpenCV中将灰度图像复制到RGB图像红色通道?

  7. 7

    如何在KonvaJS中将过滤器应用于具有图像填充的形状?

  8. 8

    如何在dynamicjs中将遮罩应用于填充有图像对象的矩形

  9. 9

    将CSS灰度属性应用于图像

  10. 10

    将CSS色相旋转滤镜应用于灰度图像

  11. 11

    将自适应阈值应用于灰度图像

  12. 12

    如何融合图像蒙版?

  13. 13

    如何在图像上应用灰度滤镜?

  14. 14

    在Python中将RGB图像转换为灰度

  15. 15

    MATLAB:在RGB图像上应用透明蒙版并与另一个蒙版混合

  16. 16

    MATLAB:在RGB图像上应用透明蒙版并与另一个蒙版混合

  17. 17

    如何在图像上制作圆形蒙版

  18. 18

    如何在图像上使用CSS蒙版?

  19. 19

    如何在不将转换应用于其蒙版的情况下在Snap.svg中转换形状?

  20. 20

    将归一化应用于RGB图像并获取RGB图像作为输出

  21. 21

    在OpenCV中将Alpha通道应用于图像的最快方法

  22. 22

    如何在OpenCV Java中将二进制图像转换为灰度

  23. 23

    如何在OpenCV Java中将二进制图像转换为灰度

  24. 24

    如何调整图像分割蒙版的大小?

  25. 25

    如何使图像蒙版显示在悬停上

  26. 26

    如何将Alpha蒙版应用于Android可绘制对象?

  27. 27

    将函数应用于蒙版的numpy数组

  28. 28

    调用熊猫将函数应用于蒙版的结果

  29. 29

    将Alpha蒙版应用于OpenGL中的视频

热门标签

归档