访问像素值

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

 

posted @ 2020-03-11 12:30  旺仔!!  阅读(158)  评论(0)    收藏  举报