给图像/视频添加马赛克效果开发说明书

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_20965753/article/details/89224732

1. 给图像添加马赛克程序.

马赛克效果: 矩形中的像素具有相同的像素值, 产生类似于马赛克的图像效果.

V1.

    for n in range(0, width, step):
        if m % step == 0 and n % step == 0:
            # (b, g, r) = img[m, n]  # left top pixel
            # mean value
            tem_sum = np.sum(img[m:m + step, n:n + step], 0)
            # [[b, g, r],
            #  [b, g, r]
            #    .....   
            #  [b, g, r]] # step rows! 
            (b, g, r) = np.sum(tem_sum, 0) / (step * step) # R, G, B channels!
            img[m:m + step, n:n + step] = (b, g, r)

V2. Flatten the matrix to a 1D array. Then op the mosaic!!! Wrong!!!

应该是按照通道进行操作的, 如对于B通道来说, 取B通过矩阵(2D矩阵)的一小块, 计算该小块均值, 然后将该小块的值均赋值成均值即可.

time_start_V2 = time.time()
img_array = img.flatten()
for k in range(0, len(img_array), step * step):
    # print(np.sum(img_array[k:k + step * step]) / (step * step))
    img_array[k:k + step * step] = np.sum(img_array[k:k + step * step]) / (step * step)

img_array= img_array.reshape((height, width, 3))

cv2.imwrite("output_V2.jpg", img_array)

time_end = time.time()
print("time cost V2", time_end - time_start_V2, "s") # scared.JPG, V2 ......

2. 轻度: 5; 中度: 10; 重度: 15.

另外, step的选择和图像的分辨率有很大关系!! 图像分辨率越大, 那么step越大才能显示出马赛克效果; 图像分辨率越小, 较小的step也可导致较重的马赛克效果.

3. 采用快速将matrix进行分块, 然后再对块进行处理, 这个操作也行不通. 因为一个2D矩阵, 生成的块矩阵是4D矩阵, 再取每一个块时, 也比较耗时.

4. 采用多线程操作.

可以解决耗时的问题. 对于一张图像而言, 直接对双层for循环进行多线程操作即可; 对于视频来说, 对于每一帧图像, 在进行完线程处理后, 先sleep(0.1s), 等待上一个线程操作完. 可以解决线程不同步问题, 因为我们要将处理后的每帧图像写入视频, 所以要进行等待!!! 简单版本处理!!!

猜你喜欢

转载自blog.csdn.net/qq_20965753/article/details/89224732
今日推荐