一、像素
-
图像数字化是指用数字表示图像。
每一幅数字图像都是由M行N列的像素组成的,其中每一个像素都存储一个像素值。计算机通常会把像素值处理为256个灰度级别,这256个灰度级别分别用区间[0,255]中的数值表示。其中,“0”表示纯黑色;“255”表示纯白色。 -
像素的位置
图片是由许多像素组成,我们按照水平方向和垂直方向上进行建立向下的坐标系,通过坐标(x,y)的点位置确定像素的位置。
opencv像素点的位置坐标: 画图的(x,y) 对应 opencv的(y,x)。 -
Cv2.ImRead
默认读取的格式是: -
分解某个像素点的BGR通道是
int blue = src_img.At<Vec3b>(p1.Y, p1.X)[0];
int green = src_img.At<Vec3b>(p1.Y, p1.X)[1];
int red = src_img.At< Vec3b > (p1.Y, p1.X)[2]; -
转换为HSV后,分解HSV通道是
Mat[] channel = Cv2.Split(hsv_image);//分割通道
int hv = channel[0].At<byte>(p1.Y, p1.X);
int sv = channel[1].At<byte>(p1.Y, p1.X);
int vv = channel[2].At<byte>(p1.Y, p1.X);
二、程序
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Image image = null;
private Mat dst = new Mat();
private Mat src_img;
string filePath = "";
bool mouseDown = false;
public OpenCvSharp.Point p1 = new OpenCvSharp.Point(-1, -1);
#region 定义一个发送接收图像数据的全局变量SendPicData
public Mat SendPicData
{
get { return BitmapConverter.ToMat((Bitmap)pictureBox1.Image); }
set { pictureBox1.Image = value.ToBitmap(); }
}
#endregion
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Title = "选择操作的图片";
openFileDialog.Filter = "图片 *.jpg|*.jpg|*.bmp|*.bmp|图像*.png|*.png";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
filePath = openFileDialog.FileName;
image = Image.FromFile(filePath);
src_img = Cv2.ImRead(filePath);
}
if (filePath != "")
{
pictureBox1.Image = image;
textBox1.Text = src_img.Rows.ToString();
textBox2.Text = src_img.Cols.ToString();
}
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
mouseDown = true;
if (mouseDown)
{
p1.X = e.X;
p1.Y = e.Y;
textBox3.Text = "(" + e.X.ToString() + " , " + e.Y.ToString() + ")";
}
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
mouseDown = false;
Mat hsv_image = new Mat(); ;
Cv2.CvtColor(src_img, hsv_image, ColorConversionCodes.BGR2HSV);
Mat[] channel = Cv2.Split(hsv_image);//分割通道
int hv = channel[0].At<byte>(p1.Y, p1.X);
int sv = channel[1].At<byte>(p1.Y, p1.X);
int vv = channel[2].At<byte>(p1.Y, p1.X);
textBox4.Text = "(" + hv.ToString() + " , " + sv.ToString() + " , " + vv.ToString() + ")";
int blue = src_img.At<Vec3b>(p1.Y, p1.X)[0]; //#坐标(x,y)上的像素的B通道的值
int green = src_img.At<Vec3b>(p1.Y, p1.X)[1]; // #坐标(x,y)上的像素的G通道的值
int red = src_img.At< Vec3b > (p1.Y, p1.X)[2]; // #坐标(x,y)上的像素的R通道的值
textBox5.Text = "(" + blue.ToString() + " , " + green.ToString() + " , " + red.ToString() + ")";
}
}
}
三、结果
![](https://img.haomeiwen.com/i17748967/dea697208fbde8da.png)
四、资料
c1learning的博客
https://blog.csdn.net/c1learning/article/details/100130805
网友评论