如何制作图像直方图
本文关键字:直方图 图像 何制作 | 更新日期: 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转换的。