1. 程式人生 > >OpenCV-影象處理(04、影象操作)

OpenCV-影象處理(04、影象操作)

讀寫影象

  • 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; }
執行截圖

在這裡插入圖片描述