访问像素值
2020.3.11 周三 晴
一,扫描图像的方法。
这位博主总结的很全面,可以参考一下。
https://blog.csdn.net/qq_27278957/article/details/84646948
二,几个函数。
1.叠加函数:addweight(图一,权重,图二,权重,额外加权,结果图像);//图一和图二尺寸一致
eg:
Mat result; addWeighted(src,0.4,src1,0.3,0.,result);//图一 权重 图二 权重 额外权重 结果(图一图二尺寸一致) imshow("P1",result);
输出:

2,saturate_cast:将大于255的像素值调整为255,将像素值小于0的像素值调整为0.
3.remap函数:remap(原图像,目标图像,X映射,Y映射,填补方法)
4.分割图像通道
vector<Mat> planes;//创建三幅图像的向量 split(image1,planes);//将一个三通道,分为三个单通道 planes[0]+=image2;//加到蓝色通道 merge(planes,result);//将三个通道合并到一个三通道上
5.setTo函数:result.row(0).setTo(Scalar(0));//result图像的第一行像素值赋值0
三,实例。
拉普拉斯算子两种写法:
1.指针访问像素值
void sharpen(Mat &src,Mat &result) { //result.create(src.size(),src.type());//c创建与src相同的dst result=src.clone(); int nchannels=src.channels(); for(int j=1;j<src.rows-1;j++) { const uchar* previous=src.ptr<const uchar>(j-1);//上一行 const uchar* current=src.ptr<const uchar>(j);//现在 const uchar* next=src.ptr<const uchar>(j+1);//下一行 uchar* output=result.ptr<uchar>(j); for(int i=nchannels;i<(src.cols-1)*nchannels;i++) { *output++=saturate_cast<uchar>(5*current[i]-current[i-nchannels]-current[i+nchannels]-previous[i]-next[i]); } } result.row(0).setTo(Scalar(0)); result.row(result.rows-1).setTo(Scalar(0)); result.col(0).setTo(Scalar(0)); result.col(result.cols-1).setTo(Scalar(0)); }
2.运用内核模板filter2D
核心矩阵:
| 0 | -1 | 0 |
| -1 | 5 | -1 |
| 0 | -1 | 0 |
代码:
void sharpen(Mat &src,Mat &result) { Mat kernal(3,3,CV_32F,Scalar(0)); kernal.at<float>(0,1)=-1; kernal.at<float>(1,0)=-1; kernal.at<float>(1,1)=5; kernal.at<float>(1,2)=-1; kernal.at<float>(2,1)=-1; filter2D(src,result,src.depth(),kernal); }
//end

浙公网安备 33010602011771号