我想从pictureBox1
中的图片中去除灰色,如下面的第一张照片所示。第二张照片显示了可以用于此操作的公式。我写了一个近似的代码,但是编译器抛出了一个错误,即变量red1、green1和blue1由于类型不兼容而无法写入Color newPixel。请帮助我修复我的代码。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void pictureBox1_Click(object sender, EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Title = "Відкрити зображення";
dlg.Filter = "jpg files (*.jpg)|*.jpg|All filles (*.*)|*.*";
if (dlg.ShowDialog() == DialogResult.OK)
{
pictureBox1.Image = new Bitmap(dlg.OpenFile());
pictureBox1.Height = pictureBox1.Image.Height;
pictureBox1.Width = pictureBox1.Image.Width;
}
dlg.Dispose();
label1.Visible = false;
}
private void button1_Click(object sender, EventArgs e)
{
Bitmap input = new Bitmap(pictureBox1.Image);
Bitmap output = new Bitmap(input.Width, input.Height);
int[] red = new int[256];
int[] green = new int[256];
int[] blue = new int[256];
for (int x = 0; x < input.Width; x++)
{
for (int y = 0; y < input.Height; y++)
{
Color pixel = ((Bitmap)pictureBox1.Image).GetPixel(x, y);
red[pixel.R]++;
green[pixel.G]++;
blue[pixel.B]++;
double Ri = red.Average();
double Gi = green.Average();
double Bi = blue.Average();
double Avg = (Ri+Bi+Gi)/3;
double red1 = red (Avg/Ri);
double green1 = green(Avg / Gi);
double blue1 = blue(Avg / Bi);
Color newPixel = ((Color)red1| (Color)green1 | (Color)blue1);
output.SetPixel(x, y, Color.((int)newPixel));
}
}
pictureBox2.Image = output;
}
}
}
2条答案
按热度按时间ffvjumwh1#
你应该使用
Color.FromArgb()
来创建新的颜色。但是,这个方法需要3个int
作为输入,而不是double
,所以你需要把你的双精度数转换成整数。简单类型转换-
(int)someDouble
此解决方案将简单地从双精度值(
1.9 => 1
)中删除所有小数:Math.Round(someDouble)
此解决方案会将双精度值舍入为最接近的整数(
1.5 => 2
和1.49 => 1
):vddsk6oq2#
您误解了公式。公式中的
N
指定了图像中的像素总数。带下划线的字母表示图像的平均通道值。这些变量应该是double
类型。我分别将它们命名为redAverage
、greenAverage
和blueAverage
。正如您已经知道的,Avg
是这些变量的平均值。最后,R'
、G'
、B'
是使用旧值计算的新通道值。