如何制作图像直方图

本文关键字:直方图 图像 何制作 | 更新日期: 2023-09-27 18:18:21

我必须在红色,绿色和蓝色平面上制作图像直方图。

我有这个代码,但它是在Visual Basic和我需要它在c#我需要打开一张图片,然后为它制作直方图。

Public Class Form1
Public Function histogramaAcumulado(ByVal bmp As Bitmap) As Integer(,)
    'Creamos una matriz que contendrá el histograma acumulado
    Dim Rojo, Verde, Azul As Byte 'Declaramos tres variables que almacenarán los colores
    Dim matrizAcumulada(2, 255) As Integer
    For i = 0 To bmp.Width - 1 'Recorremos la matriz
        For j = 0 To bmp.Height - 1
            Rojo = bmp.GetPixel(i, j).R 'Asignamos el color
            Verde = bmp.GetPixel(i, j).G
            Azul = bmp.GetPixel(i, j).B
            'ACumulamos los valores. 
            matrizAcumulada(0, Rojo) += 1
            matrizAcumulada(1, Verde) += 1
            matrizAcumulada(2, Azul) += 1
        Next
    Next
    Return matrizAcumulada
End Function
Dim histoAcumulado As Integer(,) 'Variable que almacenará los histogramas
Private Sub Form1_(Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'Cargamos los histogramas
    Dim bmp As New Bitmap(PictureBox1.Image)
    histoAcumulado = histogramaAcumulado(bmp)
    'Ejecutamos el botón del histograma rojo
    Button1_Click(sender, e)
End Sub
'Histograma rojo
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    'Borramos el posible contenido del chart
    Chart1.Series("Histograma").Points.Clear()
    'Los ponesmos del colores correspondiente
    Chart1.Series("Histograma").Color = Color.Red
    For i = 0 To 255
        Chart1.Series("Histograma").Points.AddXY(i + 1, histoAcumulado(0, i))
    Next
End Sub
'Histograma verde
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    'Borramos el posible contenido del chart
    Chart1.Series("Histograma").Points.Clear()
    Chart1.Series("Histograma").Color = Color.Green
    For i = 0 To 255
        Chart1.Series("Histograma").Points.AddXY(i + 1, histoAcumulado(1, i))
    Next
End Sub
'Histograma azul
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    'Borramos el posible contenido del chart
    Chart1.Series("Histograma").Points.Clear()
    Chart1.Series("Histograma").Color = Color.Blue
    For i = 0 To 255
        Chart1.Series("Histograma").Points.AddXY(i + 1, histoAcumulado(2, i))
    Next
End Sub

结束类

如何制作图像直方图

我需要在c#中使用它我需要打开一个图像,然后为这个图像创建直方图

如果我理解你的问题,它本质上是转换VB。NET到c#。原始代码已经创建了直方图,可以在下面的histogramaAcumulado()中看到。


注意:通常在SO上,我们更喜欢用英文编写源代码。我没有做过任何语言翻译。

附加说明:原始代码还引用了未定义的Chart1成员,从而将下面的代码标记为不可编译以及原始代码。我把它作为OP进一步探索原始VB代码以破译其含义的练习。


请查看下面的c#代码:

public class Form1
{
    public int[,] histogramaAcumulado(Bitmap bmp)
    {
        //Creamos una matriz que contendrá el histograma acumulado
        byte Rojo = 0;
        byte Verde = 0;
        byte Azul = 0;
        //Declaramos tres variables que almacenarán los colores
        int[,] matrizAcumulada = new int[3, 256];
        //Recorremos la matriz
        for (i = 0; i <= bmp.Width - 1; i++)
        {
            for (j = 0; j <= bmp.Height - 1; j++)
            {
                Rojo = bmp.GetPixel(i, j).R;
                //Asignamos el color
                Verde = bmp.GetPixel(i, j).G;
                Azul = bmp.GetPixel(i, j).B;
                //ACumulamos los valores. 
                matrizAcumulada[0, Rojo] += 1;
                matrizAcumulada[1, Verde] += 1;
                matrizAcumulada[2, Azul] += 1;
            }
        }
        return matrizAcumulada;
    }
    //Variable que almacenará los histogramas
    int[,] histoAcumulado;
    private void Form1_Load(object sender, EventArgs e)
    {
        //Cargamos los histogramas
        Bitmap bmp = new Bitmap(PictureBox1.Image);
        histoAcumulado = histogramaAcumulado(bmp);
        //Ejecutamos el botón del histograma rojo
        Button1_Click(sender, e);
    }
    //Histograma rojo
    private void Button1_Click(object sender, EventArgs e)
    {
        //Borramos el posible contenido del chart
        Chart1.Series("Histograma").Points.Clear();
        //Los ponesmos del colores correspondiente
        Chart1.Series("Histograma").Color = Color.Red;
        for (i = 0; i <= 255; i++)
        {
            Chart1.Series("Histograma").Points.AddXY(i + 1, histoAcumulado[0, i]);
        }
    }
    //Histograma verde
    private void Button2_Click(object sender, EventArgs e)
    {
        //Borramos el posible contenido del chart
        Chart1.Series("Histograma").Points.Clear();
        Chart1.Series("Histograma").Color = Color.Green;
        for (i = 0; i <= 255; i++)
        {
            Chart1.Series("Histograma").Points.AddXY(i + 1, histoAcumulado[1, i]);
        }
    }
    //Histograma azul
    private void Button3_Click(object sender, EventArgs e)
    {
        //Borramos el posible contenido del chart
        Chart1.Series("Histograma").Points.Clear();
        Chart1.Series("Histograma").Color = Color.Blue;
        for (i = 0; i <= 255; i++)
        {
            Chart1.Series("Histograma").Points.AddXY(i + 1, histoAcumulado[2, i]);
        }
    }
    public Form1()
    {
        Load += Form1_Load;
    }
}

转换工具

为了您的兴趣,代码是通过SharpDevelop Snippet Converter转换的。