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

根据邻居为像素分配颜色

林英武
2023-03-14

我已经把图像的所有黑色像素放在一个数组中,我想让它们得到它们左边邻居的颜色。我没有错误地运行代码,但结果并不是我所期望的。那些黑色条纹是从哪里来的?我以为它会全是红色的。

这是我的代码和结果。

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.util.*;


public class ImageTest {
    public static BufferedImage Threshold(BufferedImage img) {

        int height = img.getHeight();
        int width = img.getWidth();
        BufferedImage finalImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

        int r = 0;
        int g = 0;
        int b = 0;
        List<Integer> blackpixels = new ArrayList<Integer>();



        for (int x = 0; x < width; x++) {
            try {

                for (int y = 0; y < height; y++) {

                    //Get RGB values of pixels
                    int rgb = img.getRGB(x, y); 
                    r = ImageTest.getRed(rgb);
                    g = ImageTest.getGreen(rgb);
                    b = ImageTest.getBlue(rgb);

                    int leftLoc = (x-1) + y*width;

                    if ((r < 5) && (g < 5) && (b < 5)) {
                        blackpixels.add(rgb);
                        Integer[] simpleArray = new Integer[ blackpixels.size() ];
                        System.out.print(simpleArray.length);

                        int pix = 0;

                        while(pix < simpleArray.length) {
                            r = leftLoc;
                            pix = pix +1;   
                        }


                    }

                    finalImage.setRGB(x,y,ImageTest.mixColor(r, g,b));  
                }

                }
            catch (Exception e) {
                    e.getMessage();
            }
    }
    return finalImage;

    }
    private static int mixColor(int red, int g, int b) {
        return red<<16|g<<8|b;
    }

    public static int getRed(int rgb) {
        return (rgb & 0x00ff0000)  >> 16;
    }

    public static int getGreen(int rgb) {
        return  (rgb & 0x0000ff00)  >> 8;
    }

    public static int getBlue(int rgb) {
        return (rgb & 0x000000ff)  >> 0;

    }
}

共有1个答案

杜建章
2023-03-14

以下方法可能奏效。主要的变化是,它首先收集所有暗像素的位置,然后通过它们来分配它们左边邻居的颜色。

import java.awt.image.BufferedImage;
import java.util.*;

public class BlackRedImage
{
    public static BufferedImage Threshold( BufferedImage img )
    {
        int height = img.getHeight();
        int width = img.getWidth();
        BufferedImage finalImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

        List<Integer> blackpixels = new ArrayList<Integer>();

        for ( int x = 0; x < width; x++ )
        {
            for ( int y = 0; y < height; y++ )
            {
                int rgb = img.getRGB(x, y); // Get the pixel in question
                int r = BlackRedImage.getRed(rgb);
                int g = BlackRedImage.getGreen(rgb);
                int b = BlackRedImage.getBlue(rgb);

                if ( (r < 5) && (g < 5) && (b < 5) )
                { // record location of any "black" pixels found
                    blackpixels.add(x + (y * width));
                }

                finalImage.setRGB(x, y, rgb);
            }
        }

        // Now loop through all "black" pixels, setting them to the colour found to their left
        for ( int blackPixelLocation: blackpixels )
        {
            if ( blackPixelLocation % width == 0 )
            { // these pixels are on the left most edge, therefore they do not have a left neighbour!
                continue;
            }

            int y = blackPixelLocation / width;
            int x = blackPixelLocation - (width * y);

            int rgb = img.getRGB(x - 1, y); // Get the pixel to the left of the "black" pixel
            System.out.println("x = " + x + ", y = " + y + ", rgb = " + rgb);
            finalImage.setRGB(x, y, rgb);
        }
        return finalImage;
    }

    private static int mixColor( int red, int g, int b )
    {
        return red << 16 | g << 8 | b;
    }

    public static int getRed( int rgb )
    {
        return (rgb & 0x00ff0000) >> 16;
    }

    public static int getGreen( int rgb )
    {
        return (rgb & 0x0000ff00) >> 8;
    }

    public static int getBlue( int rgb )
    {
        return (rgb & 0x000000ff) >> 0;
    }
}

编辑:这里有一个更简单的版本(不收集黑色像素)

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.util.*;

public class ColourMove
{
    public static BufferedImage Threshold( BufferedImage img )
    {
        int width = img.getWidth();
        int height = img.getHeight();
        BufferedImage finalImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

        for ( int x = 1; x < width; x++ ) // Start at 1 as the left most edge doesn't have a left neighbour
        {
            for ( int y = 0; y < height; y++ )
            {
                Color colour = new Color(img.getRGB(x, y));
                int red = colour.getRed();
                int green = colour.getGreen();
                int blue = colour.getBlue();

                if ( (red < 5) && (green < 5) && (blue < 5) )
                { // Encountered a "black" pixel, now replace it with it's left neighbour
                    finalImage.setRGB(x, y, img.getRGB(x - 1, y));
                }
                else
                { // Non-black pixel
                    finalImage.setRGB(x, y, colour.getRGB());
                }
            }
        }
        return finalImage;
    }
}
 类似资料:
  • 问题内容: 我有一个像这样的numpy数组: 我需要创建一个函数,并使用以下输入参数将其称为“邻居”: x:numpy 2d数组 (i,j):二维数组中元素的索引 d:邻域半径 作为输出,我想获得给定距离的单元格的邻居。所以如果我跑步 我应该获取以下值的索引:。我希望我说清楚。是否有像scipy这样的库来处理这个问题? 我已经做了一些工作,但这是一个粗略的解决方案。 我该如何改善? 问题答案: 编

  • 我的目标的在线示例: 我试图在分类页面上显示自行车产品。每个产品上都有一种不同的边框颜色,我用圆形div来显示。 当我点击一种颜色时,图像应该会发生变化,正如你在专业网站上看到的那样:(产品图像下方)专业示例。 我自己的网站 您可以在这里看到我自己的示例:我自己的网站示例(向下滚动,直到您看到具有多个产品的产品)。 我的目标功能: 当我单击绿色div时,我想显示图片2,当我单击红色div时,我想看

  • 我正在尝试在MATLAB中对图像中的一个物体进行形状分析(特别是)。为此,我找到了边界像素。对于每个边界像素,我使用8邻域理论计算它的邻域。现在我正在计算一个点与它的唯一邻居的切线(取决于我如何选择顺时针或其他方式)。如果每个像素正好有两个邻居,我的算法就能正常工作。对于本图所示的形状(顺序为9 X 15像素)。 但如果一个像素的邻域超过2个,那么我的算法就会混乱。例如,如(顺序为9 X 15像素

  • 我正在写一个小程序,介绍如何计算网格中给定位置的邻域之和。由于某些原因,程序无法识别正确的值。我想知道这可能是因为我使用了try-catch来限制出界,还是我错过了什么? 我使用的是一个简单的3x3网格,编号为1-9。我在许多其他测试中使用了相同的矩阵,因此假设网格没有问题。即使我在一步一步地调试和检查时得到了11。我不太明白,有人有主意吗? 和中的-1只是将其强制为11(2 4 5),但程序在运

  • 问题内容: 我想从我的Fluke机器人那里得到一张图像,并确定图像中每个像素的颜色。然后,如果像素大部分为红色,请将其更改为完全绿色。如果像素大部分是绿色,请将其更改为完全蓝色。如果像素大部分是蓝色,请将其更改为完全红色。这是我能够做的,但是我无法使它工作以获取必须更改的图像。没有语法错误,这只是语义上的麻烦。我正在使用python。 我尝试的代码: 我也保存了如下图片: 问题答案: 我假设您正在

  • 在matlab中,我有一个非负数项的矩阵a。见以下一条: 我想找到所有零元素的邻居,除了零元素。这意味着我想在向量v中存储a(1,1),a(2,5),a(3,1),a(3,6),a(4,5)和a(5,1)的邻居,如果这些邻居中的一个是零,那么我就不存储它。 所谓元素(i,j)的邻居,是指离(i,j)远一个元素的元素,即A(i,j+1)、A(i,j-1)、A(i-1,j)、A(i-1,j-1)、A(