opencv3/C++影象畫素操作詳解
阿新 • • 發佈:2020-01-09
RGB影象轉灰度圖
RGB影象轉換為灰度圖時通常使用:
進行轉換,以下嘗試通過其他對影象畫素操作的方式將RGB影象轉換為灰度影象。
#include<opencv2/opencv.hpp> #include<math.h> using namespace cv; int main() { //畫素操作 Mat src,dst; src = imread("E:/image/image/daibola.jpg"); if(src.empty()) { printf("can not load image \n"); return -1; } namedWindow("input"); imshow("input",src); dst.create(src.size(),src.type()); for(int row = 0; row < src.rows; row++) { for(int col = 0; col < src.cols; col++) { 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] = max(r,max(g,b)); dst.at<Vec3b>(row,col)[1] = max(r,col)[2] = max(r,b)); } } namedWindow("output"); imshow("output",dst); waitKey(); }
同理使用min(r,min(g,b))可以看到由於選擇了較小的灰度值影象會明顯變暗:
影象線性增強
通過對影象畫素操作(線性變換),實現影象的線性增強。
#include<opencv2/opencv.hpp> #include<math.h> using namespace cv; int main() { Mat src1,dst; src1 = imread("E:/image/image/im1.jpg"); if(src1.empty()) { printf("can not load im1 \n"); return -1; } double alpha = 1.2,beta = 50; dst = Mat::zeros(src1.size(),src1.type()); for(int row = 0; row < src1.rows; row++) { for(int col = 0; col < src1.cols; col++) { if(src1.channels() == 3) { int b = src1.at<Vec3b>(row,col)[0]; int g = src1.at<Vec3b>(row,col)[1]; int r = src1.at<Vec3b>(row,col)[2]; dst.at<Vec3b>(row,col)[0] = saturate_cast<uchar>(b*alpha + beta); dst.at<Vec3b>(row,col)[1] = saturate_cast<uchar>(g*alpha + beta); dst.at<Vec3b>(row,col)[2] = saturate_cast<uchar>(r*alpha + beta); } else if (src1.channels() == 1) { float v = src1.at<uchar>(row,col); dst.at<uchar>(row,col) = saturate_cast<uchar>(v*alpha + beta); } } } namedWindow("output",CV_WINDOW_AUTOSIZE); imshow("output",dst); waitKey(); return 0; }
掩膜操作調整影象對比度
使用一個3×3掩模增強影象對比度:
#include<opencv2/opencv.hpp> #include<math.h> using namespace cv; int main() { Mat src,dst; src = imread("E:/image/image/daibola.jpg"); CV_Assert(src.depth() == CV_8U); if(!src.data) { printf("can not load image \n"); return -1; } src.copyTo(dst); for(int row = 1; row<(src.rows - 1); row++) { const uchar* previous = src.ptr<uchar>(row - 1); const uchar* current = src.ptr<uchar>(row); const uchar* next = src.ptr<uchar>(row + 1); uchar* output = dst.ptr<uchar>(row); for(int col = src.channels(); col < (src.cols - 1)*src.channels(); col++) { *output = saturate_cast<uchar>(9 * current[col] - 2*previous[col] - 2*next[col] - 2*current[col - src.channels()] - 2*current[col + src.channels()]); output++; } } namedWindow("image",CV_WINDOW_AUTOSIZE); imshow("image",dst); waitKey(); return 0; }
畫素重對映
利用cv::remap實現畫素重對映;
cv::remap引數說明:
Remap( InputArray src,// 輸入影象 OutputArray dst,// 輸出影象 InputArray map1,// 對映表1(CV_32FC1/CV_32FC2) InputArray map2,// 對映表2(CV_32FC1/CV_32FC2) int interpolation,// 選擇的插值 int borderMode,// 邊界型別(BORDER_CONSTANT) const Scalar borderValue// 顏色 )
插值方法:
CV_INTER_NN =0,CV_INTER_LINEAR =1,CV_INTER_CUBIC =2,CV_INTER_AREA =3,CV_INTER_LANCZOS4 =4
通過畫素重對映實現影象垂直翻轉:
#include<opencv2/opencv.hpp> using namespace cv; int main() { Mat src,dst; src = imread("E:/image/image/daibola.jpg"); if(src.empty()) { printf("can not load image \n"); return -1; } namedWindow("input",CV_WINDOW_AUTOSIZE); imshow("input",src); Mat mapx,mapy; mapx.create(src.size(),CV_32FC1); mapy.create(src.size(),CV_32FC1); for(int row = 0; row < src.rows; row++) { for(int col = 0; col < src.cols; col++) { mapx.at<float>(row,col) = col; mapy.at<float>(row,col) = src.rows - row - 1; } } remap(src,dst,mapx,mapy,CV_INTER_NN,BORDER_CONSTANT,Scalar(0,255,255)); namedWindow("output",dst); waitKey(); return 0; }
以上這篇opencv3/C++影象畫素操作詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。