首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何找到图像中特定颜色的像素数?

如何找到图像中特定颜色的像素数?
EN

Stack Overflow用户
提问于 2011-06-21 19:34:36
回答 3查看 8.5K关注 0票数 2

所以我正在尝试编写一个程序,它可以找出其中有多少特定颜色的像素。这些图像是用相机拍摄的照片,然后在photoshop上标记了一些区域,我需要找到这些像素的确切数量。但我几乎没有什么问题。我使用的是getPixel(x,y),但是我正在与我想要的Color.FromArgb(红,绿,蓝)进行比较,但是……我的第一个问题是,对于颜色有点不同,例如,我想找出颜色RGB 116,110,40,但当你在photoshop上用这种颜色绘图时,一些像素会得到一点不同的颜色,如RGB 115,108,38 (和其他类似的),我也想包括这一点。所以我最终想出了这段代码(但看起来id现在可以正常工作了):

代码语言:javascript
复制
public Form1()
    {
        InitializeComponent();
    }

    Bitmap image1;
    int count=0;
    int red, green, blue;
    int redt, greent, bluet;
    double reshenie;

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            red = int.Parse(textBox1.Text);
            green = int.Parse(textBox2.Text);
            blue = int.Parse(textBox3.Text);

                           // Retrieve the image.
            image1 = new Bitmap(@"C:\bg-img.jpg", true);
             double widht, height, pixel ;
            int x, y;
            MessageBox.Show(pixel.ToString());

            // Loop through the images pixels            
            for (x = 0; x < image1.Width; x++)
            {
                for (y = 0; y < image1.Height; y++)
                {
                    Color pixelColor = image1.GetPixel(x, y);
                    redt = pixelColor.R;
                    greent = pixelColor.G;
                    bluet = pixelColor.B;


                    if ((red+10>=redt) && (red-10>=redt))//i used +-10 in attempt to resolve the problem that i have writed about the close colours
                    {

                        if ((green + 10 >= greent) && (green - 10 >= greent))
                        {
                            if ((blue + 10 >= bluet) && (blue - 10 >= bluet))
                            {
                                count += 1;

                            }
                        }
                    }
                }
            }

            pictureBox1.Image = image1;

            MessageBox.Show("Imashe " + count.ToString());
            count = 0;

        }
        catch (ArgumentException)
        {
            MessageBox.Show("There was an error." +
                "Check the path to the image file.");

        }

    }

问题是我得不到我想要的结果。例如,当我必须获得1000个像素时,我或多或少地得到了,但我找不到我的错误所在。所以如果有人能告诉我我做错了什么。提前感谢大家的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-21 19:41:52

从你的代码中:

代码语言:javascript
复制
if ((green + 10 >= greent) && (green - 10 >= greent))

如果是(a - 10 >= b),那么肯定是(a + 10 >= b)。看看你能不能理解为什么。

我想你的意思可能是

代码语言:javascript
复制
if ((green - 10 <= greent) && (greent <= green + 10))

这样对条件进行排序有助于提高可读性,因为greent必须在green - 10green + 10之间,并且在物理上也位于这两个表达式之间。

票数 1
EN

Stack Overflow用户

发布于 2011-06-21 19:41:15

试着使用这个循环:

代码语言:javascript
复制
int epsilon = 10;

for (x = 0; x < image1.Width; ++x)
{
    for (y = 0; y < image1.Height; ++y)
    {
        Color pixelColor = image1.GetPixel(x, y);
        redt = pixelColor.R;
        greent = pixelColor.G;
        bluet = pixelColor.B;

        if (Math.Abs(redt   - red)   <= epsilon &&
            Math.Abs(greent - green) <= epsilon &&
            Math.Abs(bluet  - blue)  <= epsilon)
        {
            ++ count;
        }
    }
}

其中,epsilon是每个通道的像素颜色和目标颜色之间的最大差异。

票数 5
EN

Stack Overflow用户

发布于 2011-06-21 19:42:53

我认为你的颜色对比不正确。您尝试将<=>=混合在颜色周围的范围内。试试这个:

代码语言:javascript
复制
if ((red+10 >= redt) && (red-10 <= redt)) //i used +-10 in attempt to resolve the problem that i have writed about the close colours
{
    if ((green + 10 >= greent) && (green - 10 <= greent))
    {
        if ((blue + 10 >= bluet) && (blue - 10 <= bluet))
        {
           count += 1;
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6424579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档