public partial class Form1 : Form
private string selectedImagePath;
Color backColor = Color.Empty;
private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
if ("tslSelectImage".Equals(e.ClickedItem.Name))
using OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Image Files (*.bmp, *.jpg, *.png)|*.bmp;*.jpg;*.png";
if (openFileDialog.ShowDialog() == DialogResult.OK)
selectedImagePath = openFileDialog.FileName;
Image selectedImage = Image.FromFile(selectedImagePath);
if (pictureBox1.Image != null)
pictureBox1.Image.Dispose();
pictureBox1.Image = selectedImage;
if (backColor != Color.Empty)
ChangeImage(selectedImagePath, backColor);
else if ("tslSelectBackColor".Equals(e.ClickedItem.Name))
if (string.IsNullOrEmpty(selectedImagePath))
MessageBox.Show("请选择图像");
colorDialog1.FullOpen = true;
colorDialog1.ShowHelp = true;
colorDialog1.SolidColorOnly = true;
if (colorDialog1.ShowDialog() == DialogResult.OK)
var color = colorDialog1.Color;
ChangeImage(selectedImagePath, color);
else if ("tslSave".Equals(e.ClickedItem.Name))
if (pictureBox2.Image != null)
FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
folderBrowserDialog.Description = "选择保存图像的文件夹";
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
string folderPath = folderBrowserDialog.SelectedPath;
string fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".png";
string filePath = Path.Combine(folderPath, fileName);
pictureBox2.Image.Save(filePath);
MessageBox.Show("文件保存成功!");
MessageBox.Show("文件保存失败:" + ex.Message);
private void ChangeImage(string path, Color color)
if (string.IsNullOrEmpty(selectedImagePath))
var bytes = Change2(selectedImagePath, color);
using (MemoryStream memoryStream = new MemoryStream(bytes))
if (pictureBox2.Image != null)
pictureBox2.Image.Dispose();
pictureBox2.Image = new Bitmap(memoryStream);
private byte[] Change2(string path, Color color)
using Mat img = Cv2.ImRead(path);
using Mat hsv = new Mat();
Cv2.CvtColor(img, hsv, ColorConversionCodes.BGR2HSV);
using Mat background = new Mat(hsv, new Rect(0, 0, 50, 50));
Scalar mean = Cv2.Mean(background);
int hRange = trackBar1.Value;
int sRange = trackBar2.Value;
int vRange = trackBar3.Value;
Scalar lower = new Scalar(mean.Val0 - hRange, mean.Val1 - sRange, mean.Val2 - vRange);
Scalar upper = new Scalar(mean.Val0 + hRange, mean.Val1 + sRange, mean.Val2 + vRange);
using Mat mask = new Mat();
Cv2.InRange(hsv, lower, upper, mask);
using Mat erode = new Mat();
Cv2.Erode(mask, erode, 1);
using Mat dilate = new Mat();
Cv2.Erode(erode, dilate, 1);
Scalar replaceColor = new Scalar(color.B, color.G, color.R);
using Mat result = img.Clone();
result.SetTo(replaceColor, dilate);
result.CopyTo(img, dilate);
private void trackBar1_Scroll(object sender, EventArgs e)
ChangeImage(selectedImagePath, backColor);
private void trackBar2_Scroll(object sender, EventArgs e)
ChangeImage(selectedImagePath, backColor);
private void trackBar3_Scroll(object sender, EventArgs e)
ChangeImage(selectedImagePath, backColor);