ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

如何更改黑色的白色背景

2019-08-29 08:01:10  阅读:365  来源: 互联网

标签:java algorithm image-processing imagej marvin-framework


在最近的一个项目中,我必须操纵图像,但由于这对我来说是新的,我有点迷茫.

我需要使用常规扫描设备扫描手.我可以完成这个,但背景是白色的,我需要它是黑色的.经过几天的研究找到了改变颜色的方法,我只得到了一个看似切割和粘贴在ms画中的图像.

原始图片:

Raw Scan of the hand

测试:

Raw Scan of the hand

我需要的是这样的:

Target image

我尝试使用Marvin Framework,Imagej,Catalano框架.要查看我需要的设置,我使用gimp,marving编辑器,斐济应用程序(但没有得到我正在寻找的结果).
我认为我需要的是转换为灰度,应用某种阈值,但在一定范围的颜色中使用alpha颜色(但我没有找到方法,只有二进制图像的阈值),然后应用一个掩码到原来使用阈值灰度图像,但我不知道怎么做,直接在Java中,或使用我上面提到的任何框架.
任何帮助,将不胜感激.

UPDATE
根据m69的说法,我尝试使用发光值,从rgb转换为hsl.我只设置了较暗的颜色.

首先尝试使用0.5的光阈值:

First try

第二次尝试使用0.9的光阈值

Second try

float threshold = 0.5f;

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

        int r = imageOut.getIntComponent0(x, y);
        int g = imageOut.getIntComponent1(x, y);
        int b = imageOut.getIntComponent2(x, y);
        float[] hsl = HSLColor.fromRGB(r, g, b, null);

        if(hsl[2] >= threshold){
            float t = (hsl[2]-0.5f)*2f; 
            hsl[2] -= t;
            imageOut.setIntColor(x, y, HSLColor.toRGB(hsl));
        }
    }
}

问题是这种方法改变了所有像素的光线,理想的是只改变对象外部的颜色.我在互联网上寻找一个想法,我找到了MartinJaník关于矫形分析的论文.他提出了下一个算法:

>对脚部扫描应用高斯滤波以获得滤波图像
>阈值滤波后的图像以获取二进制图像
>形态学上关闭二进制图像以获得闭合的二进制图像
>对二进制图像应用高斯滤波以获得灰度掩模
>将此蒙版应用于脚部扫描以获得整体足部图像

有了这个,我可以得到下一个结果:

Martin Janík algorithm

这接近我想要的,因为物体中的颜色不会被触及.但仍有一个问题是物体周围的白色边框.这是因为我使用的是combineByMask marving插件,它只支持二进制图像(不仅仅是二进制图像,而且只能掩盖一种颜色).我认为需要一个新的插件来组合使用灰度图像蒙版,当颜色在1-255范围内时尝试组合到图像基础以获得更暗或变亮的颜色(当颜色为255时,它应该离开,它应该离开只是基本图像的颜色).

这是我所说的掩盖灰度图像的示例图像:

Example image apply a mask using a binary image and a grayscale image

我认为这是我要走的路.

更新2

做了一些研究后,我想我接近我想要的结果.我使用的算法是:

>应用五个对比度
>转换为灰色图像
>应用高斯滤波器
>阈值图像
>形态接近
>再次使用高斯滤波器
>将此结果图像用作原始图像的灰度蒙版

这是结果图像:

Result apply a grayscale mask

这接近我想要的.在六步中,我可以应用两倍,三倍或更多倍的高斯滤波器,给出更柔和的边框效果,但最后由于扫描图像的性质,总是显示一个薄的白色边框(我认为这是我可以做的事情不处理)但我对这个结果很满意.现在我没有找到应用灰度蒙版的java算法,我编码:

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);
        }
    }

并且工作得非常好,但有一点细节,我无法解决.想法是混合图像,如gimp我做了以下操作:在上层使用灰度蒙版,将颜色应用于alpha函数为白色,给出以下结果:

Gimp mix

使用我为marving框架编写的算法,我得到下一个图像:

Using marving

不同之处在于,当原始图像上有更多白色时,我的算法不能降低强度颜色,您可以看到比较2个图像的效果.知道怎么处理吗?这是在gimp中应用图层组合后的图像结果:

Layer combination en gimp

解决方法:

你最好的选择是进入照相馆或GIMP,并使用快速蒙版功能进出你想要的颜色,你可以非常详细到像素然后退出快速掩模模式,并确保白色是你的行进蚂蚁的一部分在那里,从那里删除它继续并填充一层黑色与背景.您可以在边缘使用轻微的羽毛自然地混合它.有关如何执行此操作的更具体的教程,但这就是我将如何处理它.

标签:java,algorithm,image-processing,imagej,marvin-framework
来源: https://codeday.me/bug/20190829/1758738.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有