OpenCV Lesson 3 : Mask operations on matrices

矩阵上的掩码运算

Mask operations on matrices are quite simple. The idea is that we recalculate each pixel's value in an image according to a mask matrix (also known as kernel). This mask holds values that will adjust how much influence neighboring pixels (and the current pixel) have on the new pixel value. From a mathematical point of view we make a weighted average, with our specified values.

矩阵上的掩模运算非常简单。这个想法是我们根据掩模矩阵(也称为内核)重新计算图像中每个像素的值。该掩码保存的值将调整相邻像素(和当前像素)对新像素值的影响程度。从数学的角度来看,我们使用指定的值进行加权平均值。

Let's consider the issue of an image contrast enhancement method.

让我们考虑图像对比度增强方法的问题。

I ( i , j ) = 5 ∗ I ( i , j ) − [ I ( i − 1 , j ) + I ( i + 1 , j ) + I ( i , j − 1 ) + I ( i , j + 1 ) ] I(i,j) = 5 * I(i,j) - [I(i-1, j) + I(i+1, j)+I(i,j-1)+I(i,j+1)] I(i,j)=5∗I(i,j)−[I(i−1,j)+I(i+1,j)+I(i,j−1)+I(i,j+1)]

⟺    I ( i , j ) ∗ M , w h e r e M = i / j − 1 0 + 1 − 1 0 − 1 0 0 − 1 5 − 1 + 1 0 − 1 0 \iff I(i,j)*M, where M = \begin{matrix} {i \ / j} & -1 & 0 & +1 \\ -1 & 0 & -1 & 0 \\ 0 & -1 & 5 & -1 \\ +1 & 0 & -1 & 0 \end{matrix} ⟺I(i,j)∗M,whereM=i /j−10+1−10−100−15−1+10−10

The first notation is by using a formula, while the second is a compacted version of the first by using a mask. You use the mask by putting the center of the mask matrix (in the upper case noted by the zero-zero index) on the pixel you want to calculate and sum up the pixel values multiplied with the overlapped matrix values. It's the same thing, however in case of large matrices the latter notation is a lot easier to look over.

第一个表示法是使用公式,而第二个表示法是使用掩码的第一个表示法的压缩版本。您可以通过将掩码矩阵的中心(以零零索引表示的大写字母)放在要计算的像素上来使用掩码,并将像素值与重叠矩阵值相乘求和。这是同样的事情,但是在大型矩阵的情况下,后一种表示法更容易查看。

Built-in filter2D

First, we load one image

bash 复制代码
cv::Mat dst0, dst1;
cv::Mat src = imread( "Lena.png", IMREAD_GRAYSCALE);

Then, we need a kernel

bash 复制代码
    Mat kernel = (Mat_<char>(3,3) <<  0, -1,  0,
                                   -1,  5, -1,
                                    0, -1,  0);

Finally, do filter2D

bash 复制代码
filter2D( src, dst1, src.depth(), kernel );

Hand written

bash 复制代码
void Sharpen(const Mat& myImage,Mat& Result)
{
    CV_Assert(myImage.depth() == CV_8U);  // accept only uchar images
 
    const int nChannels = myImage.channels();
    Result.create(myImage.size(),myImage.type());
 
    for(int j = 1 ; j < myImage.rows-1; ++j)
    {
        const uchar* previous = myImage.ptr<uchar>(j - 1);
        const uchar* current  = myImage.ptr<uchar>(j    );
        const uchar* next     = myImage.ptr<uchar>(j + 1);
 
        uchar* output = Result.ptr<uchar>(j);
 
        for(int i= nChannels;i < nChannels*(myImage.cols-1); ++i)
        {
            output[i] = 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));
}

Use getTickCount(), and getTickFrequency() get the time passed

bash 复制代码
t = ((double)getTickCount() - t)/getTickFrequency();
相关推荐
好运的阿财1 分钟前
大模型热切换功能完整实现指南
人工智能·python·程序人生·开源·ai编程
互联网江湖7 分钟前
千问闯关AI混沌期:阿里画靶,吴嘉张弓,马云射箭?
人工智能
AI品信智慧数智人14 分钟前
景区AI伴游革新!山东品信数字人智能语音交互系统,重构文旅智慧体验✨
人工智能
大喵桑丶15 分钟前
ZABBIX7二次开发AI监控数据调取杂记
大数据·人工智能·python
龙文浩_30 分钟前
AI中NLP的注意力机制的计算公式解析
人工智能·pytorch·深度学习·神经网络·自然语言处理
北京软秦科技有限公司30 分钟前
物流运输环境检测进入AI报告审核时代:IACheck如何重塑报告精准性与全流程质量把控?
大数据·人工智能
鬼先生_sir33 分钟前
Spring AI Alibaba 用户使用手册
java·人工智能·springai
跟着狗蛋学安全41 分钟前
Windows本地大语言模型部署
人工智能·语言模型·自然语言处理
视***间1 小时前
智视无界,一采倾城 —— 视程空间高性能影像采集卡,开启视觉采集全新时代
人工智能·边缘计算·采集卡·ai算力·视程空间·视频采集卡