课程视频:https://www.bilibili.com/video/av29600072?p=5
内容
- 读写图片
- 读写像素
- 修改像素值
1. 读写图像
1.1 imread
可以指定加载为灰度或者 BGR 图像。
1.2 imwrite
保存图像文件,类型由扩展名决定
2. 读写像素 与 修改像素值
2.1 读写一个 GRAY 像素点的像素值 (CV_8UC1)
image .at(y, x);
int main(int argc, char** argv)
{
cv::Mat image = cv::imread(cv::samples::findFile("HappyFish.jpg"), cv::IMREAD_COLOR);
cv::namedWindow("Original Image", cv::WINDOW_AUTOSIZE);
cv::imshow("Original Image", image);
cv::Mat dst;
cv::cvtColor(image, dst, cv::COLOR_BGR2GRAY);
cv::namedWindow("Gray Image", cv::WINDOW_AUTOSIZE);
cv::imshow("Gray Image", dst);
int imageRow = dst.rows;
int imageCol = dst.cols;
for (int irow = 0; irow < imageRow; irow++)
{
for (int icol = 0; icol < imageCol; icol++)
{
int gray = dst.at<uchar>(irow, icol);
dst.at<uchar>(irow, icol) = 255 - gray;
}
}
cv::imshow("Gray Image Inversion", dst);
cv::waitKey(0);
return 0;
}
结果
2.2 读写一个 BGR 像素点的像素值
2.2.1 方法一
image .at(y,x)
int main(int argc, char** argv)
{
cv::Mat image = cv::imread(cv::samples::findFile("HappyFish.jpg"), cv::IMREAD_COLOR);
cv::namedWindow("Original Image", cv::WINDOW_AUTOSIZE);
cv::imshow("Original Image", image);
// ******************** BGR 图像反转 *********************
cv::Mat dst;
dst.create(image.size(), image.type());
int imageRow = image.rows;
int imageCol = image.cols;
for (int irow = 0; irow < imageRow; irow++)
{
for (int icol = 0; icol < imageCol; icol++)
{
int b = image.at<cv::Vec3b>(irow, icol)[0];
int g = image.at<cv::Vec3b>(irow, icol)[1];
int r = image.at<cv::Vec3b>(irow, icol)[2];
dst.at<cv::Vec3b>(irow, icol)[0] = 255 - b;
dst.at<cv::Vec3b>(irow, icol)[1] = 255 - g;
dst.at<cv::Vec3b>(irow, icol)[2] = 255 - r;
}
}
cv::imshow("BGR Inversion", dst);
cv::waitKey(0);
return 0;
}
结果
2.2.2 方法二
使用 cv::bitwise_not 操作,即通过位操作实现反转图像。
int main(int argc, char** argv)
{
cv::Mat image = cv::imread(cv::samples::findFile("HappyFish.jpg"), cv::IMREAD_COLOR);
cv::namedWindow("Original Image", cv::WINDOW_AUTOSIZE);
cv::imshow("Original Image", image);
// ******************** BGR 图像反转 *********************
cv::Mat dst;
dst.create(image.size(), image.type());
int imageRow = image.rows;
int imageCol = image.cols;
cv::bitwise_not(image, dst);
cv::imshow("BGR Inversion", dst);
cv::waitKey(0);
return 0;
}
结果
2.3 Vec3b 与 Vec3f
- Vec3b 对应三通道的顺序是 blue、green、red 的 uchar 类型数据。
- Vec3f 对应三通道的 float 类型数据
- 把 CV_8UC1 转换到 CV32F1 实现如下:
image.convertTo(dst, CV_32F);
来源:CSDN
作者:Chris Kang
链接:https://blog.csdn.net/wangyuankl123/article/details/104735810