opencv3/C++图像像素操作详解
RGB图像转灰度图
RGB图像转换为灰度图时通常使用:
进行转换,以下尝试通过其他对图像像素操作的方式将RGB图像转换为灰度图像。
#include#include usingnamespacecv; intmain() { //像素操作 Matsrc,dst; src=imread("E:/image/image/daibola.jpg"); if(src.empty()) { printf("cannotloadimage\n"); return-1; } namedWindow("input"); imshow("input",src); dst.create(src.size(),src.type()); for(introw=0;row (row,col)[0]; intg=src.at (row,col)[1]; intr=src.at (row,col)[2]; dst.at (row,col)[0]=max(r,max(g,b)); dst.at (row,col)[1]=max(r,max(g,b)); dst.at (row,col)[2]=max(r,max(g,b)); } } namedWindow("output"); imshow("output",dst); waitKey(); }
同理使用min(r,min(g,b))可以看到由于选择了较小的灰度值图像会明显变暗:
图像线性增强
通过对图像像素操作(线性变换),实现图像的线性增强。
#include#include usingnamespacecv; intmain() { Matsrc1,dst; src1=imread("E:/image/image/im1.jpg"); if(src1.empty()) { printf("cannotloadim1\n"); return-1; } doublealpha=1.2,beta=50; dst=Mat::zeros(src1.size(),src1.type()); for(introw=0;row (row,col)[0]; intg=src1.at (row,col)[1]; intr=src1.at (row,col)[2]; dst.at (row,col)[0]=saturate_cast (b*alpha+beta); dst.at (row,col)[1]=saturate_cast (g*alpha+beta); dst.at (row,col)[2]=saturate_cast (r*alpha+beta); } elseif(src1.channels()==1) { floatv=src1.at (row,col); dst.at (row,col)=saturate_cast (v*alpha+beta); } } } namedWindow("output",CV_WINDOW_AUTOSIZE); imshow("output",dst); waitKey(); return0; }
掩膜操作调整图像对比度
使用一个3×3掩模增强图像对比度:
#include#include usingnamespacecv; intmain() { Matsrc,dst; src=imread("E:/image/image/daibola.jpg"); CV_Assert(src.depth()==CV_8U); if(!src.data) { printf("cannotloadimage\n"); return-1; } src.copyTo(dst); for(introw=1;row<(src.rows-1);row++) { constuchar*previous=src.ptr (row-1); constuchar*current=src.ptr (row); constuchar*next=src.ptr (row+1); uchar*output=dst.ptr (row); for(intcol=src.channels();col<(src.cols-1)*src.channels();col++) { *output=saturate_cast (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(); return0; }
像素重映射
利用cv::remap实现像素重映射;
cv::remap参数说明:
Remap( InputArraysrc,//输入图像 OutputArraydst,//输出图像 InputArraymap1,//映射表1(CV_32FC1/CV_32FC2) InputArraymap2,//映射表2(CV_32FC1/CV_32FC2) intinterpolation,//选择的插值 intborderMode,//边界类型(BORDER_CONSTANT) constScalarborderValue//颜色 )
插值方法:
CV_INTER_NN=0, CV_INTER_LINEAR=1, CV_INTER_CUBIC=2, CV_INTER_AREA=3, CV_INTER_LANCZOS4=4
通过像素重映射实现图像垂直翻转:
#includeusingnamespacecv; intmain() { Matsrc,dst; src=imread("E:/image/image/daibola.jpg"); if(src.empty()) { printf("cannotloadimage\n"); return-1; } namedWindow("input",CV_WINDOW_AUTOSIZE); imshow("input",src); Matmapx,mapy; mapx.create(src.size(),CV_32FC1); mapy.create(src.size(),CV_32FC1); for(introw=0;row (row,col)=col; mapy.at (row,col)=src.rows-row-1; } } remap(src,dst,mapx,mapy,CV_INTER_NN,BORDER_CONSTANT,Scalar(0,255,255)); namedWindow("output",CV_WINDOW_AUTOSIZE); imshow("output",dst); waitKey(); return0; }
以上这篇opencv3/C++图像像素操作详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。