1 读写像素
1-1 读写单通道像素
读一个GRAY像素点的像素值(CV_8UC1)
- 方法一: Scalar intensity = img.at(y, x);
- 方法二: Scalar intensity = img.at(Point(x, y));
代码示例:
Mat src, dst;
src = imread("./1.png");
if (!src.data) //判断图片是否加载成功!
{
std::cout << "打开图片失败!" << std::endl;
return -1;
}
imshow("src image", src);
//CV_BGR2GRAY 将BGR(蓝绿红)颜色空间转换为灰度颜色空间
cvtColor(src, dst,CV_BGR2GRAY);
int height = dst.rows;
int widht = dst.cols;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < widht; j++)
{
int gary = dst.at<uchar>(i, j);
dst.at<uchar>(i, j) = 255 - gary;
}
}
imshow("dst", dst);
waitKey(100000);
1-2 读写3通道像素
读一个RGB像素点的像素值
Vec3f intensity = img.at<Vec3f>(y, x);
float blue = intensity.val[0];
float green = intensity.val[1];
float red = intensity.val[2];
Vec3b与Vec3f
- Vec3b对应三通道的顺序是blue、green、red的uchar类型数据。
- Vec3f 对应三通道的float类型数据
把cv_8uc1转换到cv32F1
src.convertTo(dst, cV_32F);
代码示例:
Mat src;
src = imread("./1.png");
if (!src.data) //判断图片是否加载成功!
{
std::cout << "打开图片失败!" << std::endl;
return -1;
}
imshow("src image", src);
Mat dst1;
dst1.create(src.size(), src.type());
int height = src.rows;
int widht = src.cols;
int channel = src.channels();
for (int i = 0; i < height; i++)
{
for (int j = 0; j < widht; j++)
{
if(channel==3)
{
int b_color = src.at<Vec3b>(i, j)[0];
int g_color = src.at<Vec3b>(i, j)[1];
int r_color = src.at<Vec3b>(i, j)[2];
dst1.at<Vec3b>(i, j)[0] = 255 - b_color;
dst1.at<Vec3b>(i, j)[1] = 255 - g_color;
dst1.at<Vec3b>(i, j)[2] = 255 - r_color;
}
}
}
imshow("dst1", dst1);
waitKey(100000);
注意:上述代码可通过位操作达到同样的取反色
bitwise_not(src, dst1);
1-3 ROI选择部分区域赋值
Mat aa;
Rect r(10,10,500,500);
aa = src(r);
imshow("aa", aa);
2 总结
1 灰度图像
img.at<uchar>(x,y) = 128;
2 RGB三通道
img.at<Vec3b>(x,y)[0] = 128; //blue
img.at<Vec3b>(x,y)[1] = 128; //green
img.at<Vec3b>(x,y)[2] = 128; //red
3 空白图像赋值
img =Scalar(0);
4 ROI部分区域选择
Rect r(10,10,500,500);
Mat small=img (r );
个人学习opencv总结,如有错误请大佬指正,谢谢!