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();
相关推荐
G皮T3 小时前
【人工智能】ChatGPT、DeepSeek-R1、DeepSeek-V3 辨析
人工智能·chatgpt·llm·大语言模型·deepseek·deepseek-v3·deepseek-r1
九年义务漏网鲨鱼3 小时前
【大模型学习 | MINIGPT-4原理】
人工智能·深度学习·学习·语言模型·多模态
元宇宙时间3 小时前
Playfun即将开启大型Web3线上活动,打造沉浸式GameFi体验生态
人工智能·去中心化·区块链
开发者工具分享3 小时前
文本音频违规识别工具排行榜(12选)
人工智能·音视频
产品经理独孤虾4 小时前
人工智能大模型如何助力电商产品经理打造高效的商品工业属性画像
人工智能·机器学习·ai·大模型·产品经理·商品画像·商品工业属性
老任与码4 小时前
Spring AI Alibaba(1)——基本使用
java·人工智能·后端·springaialibaba
蹦蹦跳跳真可爱5894 小时前
Python----OpenCV(图像増强——高通滤波(索贝尔算子、沙尔算子、拉普拉斯算子),图像浮雕与特效处理)
人工智能·python·opencv·计算机视觉
雷羿 LexChien4 小时前
从 Prompt 管理到人格稳定:探索 Cursor AI 编辑器如何赋能 Prompt 工程与人格风格设计(上)
人工智能·python·llm·编辑器·prompt
两棵雪松5 小时前
如何通过向量化技术比较两段文本是否相似?
人工智能
heart000_15 小时前
128K 长文本处理实战:腾讯混元 + 云函数 SCF 构建 PDF 摘要生成器
人工智能·自然语言处理·pdf