当前位置: 首页 > 知识库问答 >
问题:

如何将RGB图像转换为灰度,但保留一种颜色?-爪哇

艾灿
2023-03-14
package poza;
import java.io.*;

public class poza {

    public static void main(String[] args) {
        
        try {
            FileInputStream fis=new FileInputStream("poza.bmp");
            BufferedInputStream dis=new BufferedInputStream(fis);
            FileOutputStream sif=new FileOutputStream("poza1.bmp");
            BufferedOutputStream bos=new BufferedOutputStream(sif);
            byte[] sti=new byte[54];
            dis.read(sti,0,54);
            bos.write(sti);
            while(dis.available()>0)
            {
                int b,g,r;
                b=dis.read();
                g=dis.read();
                r=dis.read();
                System.out.print(b+" "+g+" "+r+"\n");
                int gri=(int)(0.114*b+0.587*g+0.299*r);
                if(r>=b && r>=g)
                {
                    bos.write(gri);
                    bos.write(gri);
                    bos.write(r);
                }
                else
                {
                    bos.write(b);
                    bos.write(g);
                    bos.write(r);
                    
                }
                
                System.out.print(b+" "+g+" "+r+"\n");

            }
            dis.close();
            bos.close();
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
        
    }

}

共有1个答案

邴英毅
2023-03-14

您需要注意的是,每种颜色都由3个值或通道表示,即红色、绿色和蓝色。如果你只保留其中一个频道,你会扭曲结果。

相反,您需要决定一个像素应该保留其原始颜色还是变成灰度。因此,假设您的代码已经正确地进行了灰度转换,它可以归结为:

if( keepColor ) {
  //I'll keep the order of the components that your example uses, make sure this is correct
  bos.write(b);
  bos.write(g);
  bos.write(r);
} else {
   bos.write(gri); //b
   bos.write(gri); //g
   bos.write(gri); //r
}

所以剩下的就是如何定义keepcolor了,这取决于您的需求。一个简单的选择可能是选择一种颜色,并检查像素是否在该颜色的某个阈值内,例如:

/**
  * value - the value to check
  * base - the base value to check against, i.e. the center of the range, expressed in range [0, 255]
  * difference - the allowable difference in percent, expressed in range [0.0, 1.0]
  */ 
boolean withinThreshold(int value, int base, double difference) {
   return value>= base * (1-difference) //check lower bound
     && value <= base * (1+difference); //check upper bound
}  
boolean keepColor = withinThreshold(r, 228, 0.6) //40%-160% of 228 
                  && withinThreshold(g, 95, 0.6) //40%-160% of 95
                  && withinThreshold(b, 78, 0.6); //40%-160% of 78
 类似资料:
  • 问题内容: 我试图用来读取RGB图像并将其转换为灰度。 在matlab中,我使用以下代码: 在matplotlib教程中,他们没有介绍。他们只是读了图像 然后将它们切成薄片,但这与根据我的理解将RGB转换为灰度不是同一回事。 我发现很难相信numpy或matplotlib没有将rgb转换为灰色的内置函数。这不是图像处理中的常见操作吗? 我写了一个非常简单的函数,可以在5分钟内使用导入的图像。这是非

  • 问题内容: 我正在学习使用OpenCV进行实时应用程序的图像处理。我对图像进行了一些阈值处理,并希望将轮廓标记为绿色,但是由于我的图像是黑白图像,所以它们没有显示为绿色。 在程序的早期,我曾经将RGB转换为灰度,但是回过头来,我很困惑,该函数给出了: AttributeError:“模块”对象没有属性“ CV_GRAY2RGB”。 下面的代码似乎不是用绿色绘制轮廓。这是因为它是灰度图像吗?如果是这

  • 我正在学习使用OpenCV进行图像处理的实时应用程序。我对一个图像做了一些阈值化,想要用绿色标记轮廓,但它们没有显示在绿色中,因为我的图像是黑白的。 在程序的早期,我使用将RGB转换为灰度,但回到前面,我感到困惑,函数给出的是: AttributeError:“module”对象没有属性“cv_gray2rgb”。 下面的代码似乎没有用绿色绘制轮廓。这是因为它是灰度图像吗?如果是,我可以将灰度图像

  • 图像中的每个像素都有一个rgb值,看起来像[r g b],其中r、g、b是从0到255的整数值。 现在,让我们定义8个rgb颜色极端: [0]黑色 [0 255]蓝色 [0 255 0]绿色 [0 255]青色 [255 0 0]红色 [255 0 255]洋红色 [255 0]黄色 [255]白色。 Matlab中有没有一种有效的方法,或者Matlab中的一个函数,可以将一幅图像转换成另一幅具有

  • 我有一个返回十进制值的java代码,如下所示 第一个值表示红色的颜色代码,第二个值表示绿色的颜色代码,第三个值表示蓝色的颜色代码。 有没有什么方法可以将这些RGB值转换为java中相应的颜色?

  • 问题内容: 我正在使用aparapi编写Buddhabrot分形生成器。我将其中的OpenCL部分工作了,得到了一个表示每个像素的单维数组。我将最终图像的尺寸作为最终整数,并编写了代码以获取该数组中任意点的索引。我想将其另存为图像,并且尝试将BufferedImage与TYPE_USHORT_GRAY一起使用。这是我到目前为止的内容: 问题是,我不知道将RGB设置为什么。我需要做什么? 问题答案: