OpenCV Blurring

理论 Smoothing也叫blurring(模糊化),是一个简单而常用的图像处理操作。 Smoothing有很多原因。在本教程中,我们将重点讨论平滑操作,以减少噪音。 为了进行平滑操作,我们将对我们的图像应用一个filter。最常见的filter是线性的,其中输出像素的值(即 $g(i,j)$ )为输入像素值的加权和(即 $f(i+k,j+l)$ )。 $$ g(i, j) = \sum_{k, l}{f(i+k, j+l)h(k, l)} $$ $h(k,l)$ 被称为kernel,它只不过是filter的系数。这有助于把滤波器想象成一个在图像上滑动的系数窗口。 滤波器有很多种类,这里我们将提到最常用的几种。 Normalized Box Filter(归一化块滤波器) 这个滤波器是最简单的,每个输出像素都是其内核邻居的平均值(所有的像素都有相同的权重)。 $$ K = \frac{1}{K_{width} \cdot k_{height}} \begin{bmatrix} 1 & 1 & 1 & …& 1\\ 1 & 1 & 1 & …& 1\\ . & . & . & …& 1\\ 1 & 1 & 1 & …& 1 \end{bmatrix} $$ Gaussian Filter(高斯滤波器) 可能是最有用的滤波器(尽管不是最快的)。高斯滤波是通过用高斯内核对输入阵列中的每个点进行卷积,然后将它们全部相加来产生输出阵列的。 让我们回顾一下1D Gaussian kernel是什么样子: 假设图像是一维的,你可以注意到,位于中间的像素会有最大的权重。它的邻居的权重随着它们与中心像素之间的空间距离增加而减少。...

January 9, 2022 · 1 min · fffzlfk

Cuda软件架构

硬件 SP(Streaming Processor):流处理器,是GPU最基本的处理单元,在fermi架构开始被叫做CUDA core。 SM(Streaming MultiProcessor):一个SM由多个CUDA core组成。 比如说,如果一个GPU有 $4$ 个SM,并且每个SM有 $768$ 个SP(Aka CUDA core);那么在某一时刻,真正并行运行的线程数不会超过 $4 \times 768$ 个。 软件 threads被组织成blocks。一个block的线程可以用1Dimension(x), 2Dimensions(x, y)或者3Dim indexs(x, y, z) 索引, 显然,如果你需要 $4 \times 768$ 个以上的threads的话你需要 $4$ 个以上的blocks。blocks也可以使用1D, 2D或3D索引,这些blocks被放在等待队列上进入GPU执行。 Wrap 当一个kernel被执行时,grid中的线程块被分配到SM上。一个CUDA core可以执行一个thread,一个SM的CUDA core会分成几个wrap,由wrap scheduler负责调度。 一个wrap中的线程在同一个block中,如果block所含线程数不是wrap的大小的整数倍,那么多出来的那些thread所在的wrap中,会剩余一些inactive的thread。 一个简单的case 处理一张 $512 \times 512$ 的图片。 假设我们希望一个线程处理一个像素pixel(i, j)。 我们可以使用每 $64$ 个线程的区块。所以我们需要 $\frac{512 \times 512 }{64} = 4096$ 个区块(为了拥有 $512 \times 512 $ 个线程 )。 通常情况下,我们将线程组织在2D区块中(为了更容易索引图像像素)。blockDim= $8 * 8$ ,我更喜欢叫它threadsPerBlock。 dim3 threadsPerBlock(8, 8); 还有2D的gridDim= $64 \times 64$ (需要 $4096$ 个区块)。我更喜欢叫它numBlocks。...

January 8, 2022 · 1 min · fffzlfk

CodeForces 762

Codeforces Round #762 (Div. 3)

December 26, 2021 · 4 min · fffzlfk

从模板元编程到constexpr(C++)

C++元编程

November 28, 2021 · 2 min · fffzlfk

Go设计模式

Go Design Scheme

July 18, 2021 · 1 min · fffzlfk