操作图像像素
图像操作读写图像读写像素修改像素值Vec3b与Vec3F
代码中函数简介自定义函数opencv自带函数
代码实现效果具体代码实现
图像操作
读写图像
imread 可以指定加载为灰度或者RGB图像Imwrite 保存图像文件,类型由扩展名决定
读写像素
读一个GRAY像素点的像素值(CV_8UC1) Scalar intensity = img.at(y, x); 或者 Scalar intensity = img.at(Point(x, y));
读一个RGB像素点的像素值 Vec3f intensity = img.at(y, x); float blue = intensity.val[0]; float green = intensity.val[1]; float red = intensity.val[2];
修改像素值
灰度图像 img.at(y, x) = 128;
RGB三通道图像 img.at(y,x)[0]=128; // blue img.at(y,x)[1]=128; // green img.at(y,x)[2]=128; // red
空白图像赋值 img = Scalar(0);
ROI选择 Rect r(10, 10, 100, 100); Mat smallImg = img®;
Vec3b与Vec3F
Vec3b对应三通道的顺序是blue、green、red的uchar类型数据。Vec3f对应三通道的float类型数据 把CV_8UC1转换到CV32F1实现如下: src.convertTo(dst, CV_32F);
代码中函数简介
自定义函数
1. void grayInvert(Mat &gray); 功能:只对单通道灰度图像进行反差操作,:内含显示及存储功能 参数1:输入单通道灰度图像
2. void invertImage(Mat &src, Mat &dst); 功能:既可以对彩色图像进行反差,也可以对灰度图像进行反差(与opencv自带的一个函数bitwise_not功能相同,只是此处对图片像素值的操作不是二进制的操作) 参数1:输入一个图片(三通道或单通道都可) 参数2:输出dst反差图像
3. void imageToGray(Mat &src, Mat &dst); 功能:将rgb彩色图像变为单通道灰度图像(在其内转成灰度图像的方式较多,灰度图像有亮有暗) 参数1:输入一个三通道图像 参数2:输出单通道灰度图像
opencv自带函数
1. cvtColor(src, gray, CV_RGB2GRAY); 参数1:输入图像(此处应输入rgb三通道图像) 参数2:输出图像(此处输出单通道灰度图像) 参数3:此处使用CV_RGB2GRAY,表示将读入的rgb彩色图像变为gray灰度图像
2. bitwise_not(src, dst2); 功能:是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制 “非” 操作,~1 = 0,~0=1 参数1:输入一个图片(单通道或三通道都可) 参数2:输出像素值被二进制“非”过的图像
代码实现效果
1. 原始图像(为三通道彩色图像) 2. 原始彩色图像经由cvtColor(src, gray, CV_RGB2GRAY);所得的灰度图像(较暗) 3. 灰度图像经由grayInvert(gray);所得的反差图像 4. 原始彩色图像经由invertImage(src, dst);所得的反差图像(与bitwise_not结果相同) 5. 原始彩色图像经由bitwise_not(src, dst2);所得的反差图像 6. 原始彩色图像经由imageToGray(src, gray2);所得的灰度图像(较亮)
具体代码实现
#include
<opencv2
/opencv
.hpp
>
#include
<iostream
>
using namespace std
;
using namespace cv
;
void grayInvert(Mat
&gray
);
void invertImage(Mat
&src
, Mat
&dst
);
void imageToGray(Mat
&src
, Mat
&dst
);
int
main(){
Mat src
;
src
= imread("1.jpg");
if (!src
.data
){
printf("could not load image...\n");
return -1;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src
);
Mat gray
;
cvtColor(src
, gray
, CV_RGB2GRAY);
namedWindow("cvtColor gray image", CV_WINDOW_AUTOSIZE);
imshow("cvtColor gray image", gray
);
imwrite("cvtColor_gray.jpg", gray
);
grayInvert(gray
);
Mat dst
;
invertImage(src
, dst
);
imshow("invertImage image", dst
);
imwrite("invertImage.jpg", dst
);
Mat dst2
;
bitwise_not(src
, dst2
);
imshow("bitwise_not image", dst2
);
imwrite("bitwise_not.jpg", dst2
);
Mat gray2
;
imageToGray(src
, gray2
);
imshow("imageToGray image", gray2
);
imwrite("imageToGray2.jpg", gray2
);
waitKey(0);
return 0;
}
void grayInvert(Mat
&gray
){
int height
= gray
.rows
;
int width
= gray
.cols
;
for (int row
= 0; row
< height
; row
++){
for (int col
= 0; col
< width
; col
++){
int grayValue
= gray
.at
<uchar
>(row
, col
);
gray
.at
<uchar
>(row
, col
) = (255 - grayValue
);
}
}
imshow("gray invert", gray
);
imwrite("gray_invert.jpg", gray
);
}
void invertImage(Mat
&src
, Mat
&dst
){
dst
.create(src
.size(), src
.type());
int height
= src
.rows
;
int width
= src
.cols
;
int nc
= src
.channels();
for (int row
= 0; row
< height
; row
++){
for (int col
= 0; col
< width
; col
++){
if (nc
== 1){
int grayValue
= src
.at
<uchar
>(row
, col
);
dst
.at
<uchar
>(row
, col
) = (255 - grayValue
);
}
else if (nc
== 3){
int b
= src
.at
<Vec3b
>(row
, col
)[0];
int g
= src
.at
<Vec3b
>(row
, col
)[1];
int r
= src
.at
<Vec3b
>(row
, col
)[2];
dst
.at
<Vec3b
>(row
, col
)[0] = 255 - b
;
dst
.at
<Vec3b
>(row
, col
)[1] = 255 - g
;
dst
.at
<Vec3b
>(row
, col
)[2] = 255 - r
;
}
}
}
}
void imageToGray(Mat
&src
, Mat
&dst
){
dst
.create(src
.size(), CV_8UC1);
int height
= src
.rows
;
int width
= src
.cols
;
int nc
= src
.channels();
for (int row
= 0; row
< height
; row
++){
for (int col
= 0; col
< width
; col
++){
if (nc
== 1){
cout
<< "此为单通道图像,无需再次灰度化" << endl
;
}
else if (nc
== 3){
int b
= src
.at
<Vec3b
>(row
, col
)[0];
int g
= src
.at
<Vec3b
>(row
, col
)[1];
int r
= src
.at
<Vec3b
>(row
, col
)[2];
dst
.at
<uchar
>(row
, col
) = max(b
, max(g
, r
));
}
}
}
}