OpenCV-影象處理(04、影象操作)
阿新 • • 發佈:2019-01-05
讀寫影象
- 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< Vec3b>(y,x)[0]=128; // blue
img.at< Vec3b>(y,x)[1]=128; // green
img.at< Vec3b>(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);
上述程式碼案例
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace std;
using namespace cv;
int main(int argc,char** argv){
Mat src=imread("E:/Experiment/OpenCV/Pictures/dog2.jpg");
if(!src.data){
cout<<"Could not load Image ..."<<endl;
return -1;
}
imshow("input",src);
Mat gray_src;
cvtColor(src,gray_src,CV_RGB2GRAY);//轉化成灰度影象
imshow("gary_src",gray_src);
//單通道影象處理
int height=gray_src.rows;
int width=gray_src.cols;
for (int row = 0; row < height; row++){
for (int col = 0; col < width; col++){
int gary=gray_src.at<uchar>(row,col);//讀取影象中 row,col 位置的畫素(顏色資料由單通道組成),所以<>中用uchar,只返回的是一個uchar值
gray_src.at<uchar>(row,col)=255-gary;//顏色值取反,255-原來的值。即:越黑的地方越白;越白的地方越黑
}
}
imshow("gary_src_changed",gray_src);
//多通道影象處理
Mat dst;
dst.create(src.size(),src.type());
height=src.rows;
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 gary=gray_src.at<uchar>(row,col);
gray_src.at<uchar>(row,col)=255-gary;
}else if(nc==3){//顏色值取反,若分別將 b g r 通道顏色設為0,圖片整體顏色為 偏黃、偏緋紅、偏青色
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;
}
}
}
imshow("src_changed",dst);
Mat dst2;
bitwise_not(src, dst2);//bitwise_not()顏色值取反,同上面演算法一致,這個是通過位操作 與或非 實現的
imshow("src_changed2",dst2);
//其他操作(處理灰度影象的其他方式)
Mat dst3,dst4,dst5;
dst3.create(src.size(),src.type());//初始化影象
cvtColor(src,dst4,CV_RGB2GRAY);//將其變為單通道影象,否則影象寬度只有原影象的3分之一,也可以寫成下面這種方式
dst5.create(src.size(),CV_8UC1);//或者直接定義成:Mat dst5(src.size(),CV_8UC1);
height=src.rows;
width=src.cols;
nc=src.channels();
for (int row = 0; row < height; row++){
for (int col = 0; col < width; col++){
if(nc==1){
int gary=gray_src.at<uchar>(row,col);
gray_src.at<uchar>(row,col)=255-gary;
}else if(nc==3){//顏色值取反,若分別將 b g r 通道顏色設為0,圖片整體顏色為 偏黃、偏緋紅、偏青色
int b = src.at<Vec3b>(row,col)[0];
int g = src.at<Vec3b>(row,col)[1];
int r = src.at<Vec3b>(row,col)[2];
dst3.at<Vec3b>(row,col)[0] = b;
dst3.at<Vec3b>(row,col)[1] = 0;//將 g 的值全部變為0
dst3.at<Vec3b>(row,col)[2] = r;
dst4.at<uchar>(row,col) = max(r, max(b, g));//隨意設定的灰度圖,取max影象會比取min亮
dst5.at<uchar>(row,col) = min(r, min(b, g));
}
}
}
imshow("change b=0",dst3);
imshow("gray_src->max(b,g,r)",dst4);
imshow("gray_src->min(b,g,r)",dst5);
waitKey(0);
return 0;
}