一、API
1、Vec3b
- 通道顺序 blue grenn red 在C++中对应uchar类型 ,C#对应byte类型。
- 像素数据结构 BGR 包含三个像素值 R代表红,red; G代表绿,green; B代表蓝,blue。
- RGB模式就是,色彩数据模式,R在高位,G在中间,B在低位。BGR正好相反。
例如,如果色彩数据是24位,对于RGB模式,就是高8位是R,中间8位是G,低8位是B。
一个色彩数据共24位,3个字节。
2、Vec3f
- 对应三通道的float类型。
- 把CV_8UC1 转换到 CV32F1实现:
src.convertTo(dst,CV_32F1);
二、三通道图像像素处理
private void uiButton10_Click(object sender, EventArgs e)
{
Mat m2 = new Mat(src_img.Size(), src_img.Type());
int height = src_img.Rows;
int width = src_img.Cols;
int cn = src_img.Channels(); //获取通道数
#region 反转像素算法
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
if (cn == 1) //如果是单通道
{
byte p = m2.At<byte>(row, col); //获取像素
byte value = byte.Parse((255 - p).ToString()); //反转像素值
m2.Set(row, col, value); //赋值
}
else if (cn == 3) //如果是三通道
{
//读取源图的像素
int b = src_img.At<Vec3b>(row, col)[0];
int g = src_img.At<Vec3b>(row, col)[1];
int r = src_img.At<Vec3b>(row, col)[2];
Vec3b color = new Vec3b
{
Item0 = (byte)(255 - b), //反转像素 (byte)( Math.Max(r, Math.Max(b, g)));
Item1 = (byte)(255 - g), // (byte)(Math.Max(r, Math.Max(b, g)));
Item2 = (byte)(255 - r) // (byte)(Math.Max(r, Math.Max(b, g)));
};
/*
Vec3b color = new Vec3b //反转像素
{
Item0 = (byte)Math.Abs(src.Get<Vec3b>(row, col).Item0 - 255),
Item1 = (byte)Math.Abs(src.Get<Vec3b>(row, col).Item1 - 255),
Item2 = (byte)Math.Abs(src.Get<Vec3b>(row, col).Item2 - 255)
};
*/
//Math.Max(r, Math.Max(b, g));取灰度,min也可以,但是亮度不同
//赋值
m2.Set<Vec3b>(row, col, color);
}
}
}
#endregion
picBoxShowDel.Image = src_img.ToBitmap();
pictureBox1.Image = m2.ToBitmap();
}
三、资料
松山湖村民 https://sslcode.com.cn/
网友评论