大疆算法笔试题目解析(一)图像处理

一、图像处理(100分)

中值滤波(median filter)是图像处理中广泛使用的一种滤波器,其原理是对图像f中的每一个像素(i,j),i=1,2,...,H,j=1,2,...,W,用它的方形邻域{\Omega}_{ij}=\{​{(i',j')||i-i'|\leq r,|j-j'|\leq r}\}中的所有像素的中位数来替换它的像素值,其中r被称为该邻域的半径。对一维图像,方形邻域退化为一个闭区间:{\Omega}_{i}=[i-r,i+r]

1.(20分)试给出对8比特一维灰度图像f(i),i=1,2,...,H进行中值滤波的C/C++算法,并分析算法的时间复杂度。注意该图像只有一列像素。

算法输入:8比特一维灰度图像f,高为H.

算法输出:滤波后的8比特一维灰度图像g.高为H.

函数声明:void medianFilter1D(uchar* f, uchar* g, int H);

#include <iostream>
#include <vector>
#include <algorithm>

typedef unsigned char uchar;

void medianFilterID(uchar* f, uchar* g, int H, int radius) {
    int windowSize = 2 * radius + 1; // Size of the square window

    for (int i = 0; i < H; ++i) {
        std::vector<uchar> neighborhood;

        for (int j = -radius; j <= radius; ++j) {
            int colIndex = i + j;

            // Handle boundary cases by clamping to valid pixel indices
            colIndex = std::max(0, std::min(colIndex, H - 1));
            neighborhood.push_back(f[colIndex]);
        }

        // Sort the neighborhood to find the median
        std::sort(neighborhood.begin(), neighborhood.end());

        // Pick the median value
        g[i] = neighborhood[windowSize / 2];
    }
}

int main() {
    int H = 10; // Height of the image
    int radius = 1; // Neighborhood radius

    uchar input[] = {100, 80, 110, 90, 95, 105, 102, 98, 100, 105};
    uchar output[H];

    medianFilterID(input, output, H, radius);

    std::cout << "Original Image: ";
    for (int i = 0; i < H; ++i) {
        std::cout << static_cast<int>(input[i]) << " ";
    }

    std::cout << "\nFiltered Image: ";
    for (int i = 0; i < H; ++i) {
        std::cout << static_cast<int>(output[i]) << " ";
    }

    return 0;
}

时间复杂度O(n) 


2.(20分)试给出对8比特二维灰度图像f(i,j)i=1,2,...,H,j=1,2,...,W 进行中值滤波的算法(写出伪码即可),并分析算法的时间复杂度。

// 输入:8比特二维灰度图像f,高度H,宽度W,邻域半径r
// 输出:滤波后的图像g

for i from r to H - r:
    for j from r to W - r:
        // 构建方形邻域
        create neighborhood
        for x from -r to r:
            for y from -r to r:
                add f(i + x, j + y) to neighborhood

        // 对邻域内的像素值进行排序
        sort neighborhood

        // 取邻域中的中值
        g(i, j) = neighborhood[(2 * r + 1) * (2 * r + 1) / 2]

时间复杂度O(n^2)


3.(20分)(椒盐噪声去除)椒盐噪声也称为脉冲噪声,是图像中经常见到的一种噪声,是一种随机出现的白点或者黑点,在8比特灰度图中像素值分别为255和0.试给出一个去除或减弱灰度图像中椒盐噪声,同时尽量保持图像细节的实际算法(写出伪码即可),并分析时间复杂度。
// 输入:8比特灰度图像f,高度H,宽度W,邻域半径r
// 输出:去噪后的图像g

for i from r to H - r:
    for j from r to W - r:
        // 构建方形邻域
        create neighborhood
        for x from -r to r:
            for y from -r to r:
                add f(i + x, j + y) to neighborhood

        // 对邻域内的像素值进行排序
        sort neighborhood

        // 取邻域中的中值
        median = neighborhood[(2 * r + 1) * (2 * r + 1) / 2]

        // 判断当前像素是否为椒盐噪声
        if f(i, j) == 0 or f(i, j) == 255:
            g(i, j) = median  // 用中值替代椒盐噪声像素
        else:
            g(i, j) = f(i, j) // 保留原像素值

时间复杂度O(n^2)


4.(40分)(加权中值滤波)传统中值滤波的有个弊端:它对所有邻域内像素的重视程度是相等的,这会导致滤波后的图像丢失一些细节。针对这个问题,加权中值滤波(weighted median filter)被提出。现在考虑一维的加权中值滤波。它的原理是,根据邻域像素j与目标像素i的像素值差异对邻域像素j进行加权,然后再计算邻域内所有像素的加权中值.令像素i的邻域内像素值q的加权分布为

h(q)=\sum_{j\in\Omega_i}w(i,j) {\delta(f(i)==q),q\in [0,255],} 其中f(j)为像素j的像素值。\delta(x)为真值函

数,当x为真时\delta(x)= 1:当x为假时\delta(x)= 0;则加权中值p*为满足式(1)的最小p值. 

                                         \sum_{q=0}^{p}h(q)\geq\frac{1}{2}\sum_{q=0}^{255}h(q). (1)

例如,假设某像素点的邻域中有 7个像素,分别为{0,2,3,4,5,7,9}。则在未加权时的中值为4;如果这7个邻域像素对应的权重分别为{0.5,0.5,0.5,.5,0,1,1},则中值为5.

        特别地,考虑如下形式的权重w(i,j):

                              w(i,j)=\frac{1}{N^2}\sum_{k\in\Omega_i\cap\Omega_j}(1+\frac{(f(i)-\mu_k)(f(j)-\mu_k)}{\sigma^2_k+\epsilon}).(2)

其中\Omega_k,是以k为中心,r为半径的一个邻域,N =(2r + 1)为邻域\Omega_k中总像素数,\mu_k=\frac{1}{N}\sum_{j\in\Omega_k}f(j),\sigma^2_k=\frac{1}{N}\sum_{j\in\Omega_k}(f(j)-\mu_k^2)分别为\Omega_k中像素的均值和方差,\epsilon为一个很小的正常数
(1)(20分)试证明:按公式(2)所给权值,对任意序列p,加权和p'(i)=\sum_{j\in\Omega_i}w(i,j)p(j)可以表达为p'(i)=a(i)f(i)+b(i)的形式,其中

                  a(i)=\frac{1}{N}\sum_{j\in\Omega_i}a_j, a_j=\frac{1}{N}\frac{1}{\sigma^2_j+\epsilon}\left [ \sum_{k\in\Omega_j}f(k)p(k)-N\mu_j\bar{p_j} \right ],

                ​​​​​​​  b(i)=\frac{1}{N}\sum_{j\in\Omega_i}b_j, b_j=\bar{p_j}-a_j\mu_j,

其中\bar{p_j}=\frac{1}{N}\sum_{k\in\Omega_j}p(k).

反证法:

a(i)=\frac{1}{N^2}\sum_{j\in\Omega_i}(\frac{1}{\sigma_j^2+\epsilon}[\sum_{k\in\Omega_j}f(k)p(k)-N\mu_j\frac{1}{N}\sum_{k\in\Omega_j}p(k)])

\Leftrightarrow a(i)=\frac{1}{N^2}\sum_{j\in\Omega_i}(\frac{1}{\sigma_j^2+\epsilon}[\sum_{k\in\Omega_j}f(k)p(k)-\mu_j\sum_{k\in\Omega_j}p(k)])

\Leftrightarrow a(i)=\frac{1}{N^2}\sum_{j\in\Omega_i}(\frac{1}{\sigma_j^2+\epsilon}[\sum_{k\in\Omega_j}(f(k)-\mu_j)p(k)])

\Leftrightarrow a(i)=\frac{1}{N^2}\sum_{j\in\Omega_i}\sum_{k\in\Omega_j}(\frac{1}{\sigma_j^2+\epsilon}(f(k)-\mu_j)p(k))

同理可得b(i)

b(i)=\frac{1}{N^2}\sum_{j\in\Omega_i}\sum_{k\in\Omega_j}[(1-\frac{1}{\sigma_j^2+\epsilon}(f(k)\mu_j-\mu_j^2))p(k)]

a(i)f(i)+b(i)=\frac{1}{N^2}\sum_{j\in\Omega_i}\sum_{k\in\Omega_j}(1+\frac{1}{\sigma_j^2+\epsilon}(f(k)-\mu_j)(f(i)-\mu_j))p(k)

此时形式已经和p'(i)大致相同,接下来看求和符号这里的求和顺序为k->j>i

而由w(i,j)决定的式子求和为k->i&j,j->i,最终结果都是i

2).(20 分)试给出对 8 比特一维图像f(i),i= 1,2,...,H,按公式(2)定义的权值进行加权中值滤波的算法(写出伪码即可),并分析时间复杂度

Input: 一维图像 f(i)(长度为 H)、半径 r、常数 epsilon

Function weightedMedianFilter(f, H, r, epsilon):
    Initialize an empty array to store the filtered result: filteredImage
    
    for i = 1 to H do:
        // Compute the range of the neighborhood
        start_index = max(1, i - r)
        end_index = min(H, i + r)
        
        // Create an array to store the weighted values
        weighted_values = []
        
        for j = start_index to end_index do:
            // Compute the weight for the pair (i, j)
            weight = 0
            common_neighbors = 0
            for k = max(start_index, j - r) to min(end_index, j + r) do:
                weight += (1 + ((f[i] - mean(f[start_index:end_index])) * (f[j] - mean(f[start_index:end_index]))) / (variance(f[start_index:end_index]) + epsilon))
                common_neighbors += 1
                
            // Compute the weighted value and store it
            weighted_value = weight / (common_neighbors * common_neighbors)
            weighted_values.append(weighted_value)
        
        // Sort the weighted values
        sorted_values = sort(weighted_values)
        
        // Compute the median index
        median_index = (end_index - start_index + 1) / 2
        
        // Assign the median value to the filtered image
        filteredImage[i] = sorted_values[median_index]
    
    return filteredImage

// Call the function with the input image and parameters
filtered_image = weightedMedianFilter(f, H, r, epsilon)

时间复杂度:O(n),实际循环次数为H*(2r+1)^2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值