当前位置:   article > 正文

OpenCV:使用python-cv2进行图像的美化_ffmpeg opencv 磨皮美白

ffmpeg opencv 磨皮美白

1.图片修补

首先得到一个损坏的图像:

import cv2
import numpy as np
img = cv2.imread('img.jpg', 1)
for i in range(100,200):
    img[i, 200] = (255,255,255)
    img[i, 200+1] = (255,255,255)
    img[i, 200-1] = (255,255,255)
for i in range(150,250):
    img[150,i] = (255,255,255)
    img[150+1,i] = (255,255,255)
    img[150-1,i] = (255,255,255)
cv2.imwrite('damaged.jpg', img)
cv2.imshow('image', img)
cv2.waitKey(0)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在这里插入图片描述

我们使用cv2.inpaint来实现图像的修复

第一个参数为要修复的图片,第二个参数为要修复的位置信息

import cv2
import numpy as np
img = cv2.imread('damaged.jpg', 1)
paint = np.zeros((img.shape[0], img.shape[1], 1), np.uint8)
for i in range(100,200):
    paint[i, 200] = 255
    paint[i, 200+1] = 255
    paint[i, 200-1] = 255
for i in range(150,250):
    paint[150,i] = 255
    paint[150+1,i] = 255
    paint[150-1,i] = 255
cv2.imshow('paint', paint)
imgDat = cv2.inpaint(img, paint, 3, cv2.INPAINT_TELEA)
cv2.imshow('imgDat', imgDat)
cv2.waitKey(0)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述

2.亮度增强

原理:将原来的像素点数值增加来增强亮度

import cv2
import numpy as np
img = cv2.imread('img.jpg', 1)
cv2.imshow('img', img)
dat = np.zeros(img.shape, np.uint8)
for i in range(img.shape[0]):
    for j in range(img.shape[1]):
        (b,g,r) = img[i,j]
        b = int(b) + 40 if int(b) + 40 < 255 else 255
        g = int(g) + 40 if int(g) + 40 < 255 else 255 
        r = int(r) + 40 if int(r) + 40 < 255 else 255
        dat[i,j] = (b,g,r)
cv2.imshow('dat',dat)
cv2.waitKey(0)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在这里插入图片描述

在这里插入图片描述

样例2:取图像中各个像素点的颜色通道,让不同的颜色通道乘以不同的比例后加一个数值得到美化图像

import cv2
import numpy as np
img = cv2.imread('img.jpg', 1)
cv2.imshow('img', img)
dat = np.zeros(img.shape, np.uint8)
for i in range(img.shape[0]):
    for j in range(img.shape[1]):
        (b,g,r) = img[i,j]
        r = int(r * 1.2) + 10 if int(r * 1.2) + 10 < 255 else 255
        g = int(g * 1.2) + 10 if int(g * 1.2) + 10 < 255 else 255 
        dat[i,j] = (b,g,r)
cv2.imshow('dat',dat)
cv2.waitKey(0)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这里插入图片描述

3.磨皮美白

双边滤波(Bilateral filter) 是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点 [1] 。双边滤波器的好处是可以做边缘保存(edge preserving),一般过去用的维纳滤波或者高斯滤波去降噪,都会较明显地模糊边缘,对于高频细节的保护效果并不明显。

双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波

下面我们来使用双边滤波 cv2.bilateralFilter 来实现图像的磨皮美白方法

import cv2
img = cv2.imread("img2.jpg", 1)
cv2.imshow('img', img)
dat = cv2.bilateralFilter(img, 15,35,35)
cv2.imshow('dat',dat)
cv2.waitKey(0)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述
在这里插入图片描述

4.高斯均值滤波

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。 [1] 通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

缺点:得到的图像会变得非常模糊

import cv2
img = cv2.imread("img.jpg", 1)

dat = cv2.GaussianBlur(img, (5,5), 1, 5)
cv2.imshow('img', img)
cv2.imshow('dat', dat)
cv2.waitKey(0)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述
在这里插入图片描述

均值滤波

均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即包括目标像素本身),再用模板中的全体像素的平均值来代替原来像素值

import cv2
import numpy as np
img = cv2.imread("img.jpg", 1)
dat = np.zeros(img.shape, np.uint8)
for i in range(img.shape[0]):
    for j in range(img.shape[1]):
        sumb,sumg,sumr = 0,0,0
        for m in range(-3,3):
            for n in range(-3,3):
                if i + m >= 0 and i + m < img.shape[0] and j + n >= 0 and j + n < img.shape[1]:
                    (b,g,r) = img[i + m, j + n]
                    sumb += int(b)
                    sumg += int(g)
                    sumr += int(r)
        b = np.uint8(sumb / 36)
        g = np.uint8(sumg / 36)
        r = np.uint8(sumr / 36)
        dat[i, j] = (b,g,r)
cv2.imshow('img', img)
cv2.imshow('dat', dat)
cv2.waitKey(0)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在这里插入图片描述

在这里插入图片描述

5.中值滤波

import cv2
import numpy as np
img = cv2.imread("img.jpg", 1)
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
dat = np.zeros((img.shape[0],img.shape[1]), np.uint8)
cv2.imshow("img", img)


for i in range(img.shape[0]):
    for j in range(img.shape[1]):
        collect = []
        for m in range(-1, 2):
            for n in range(-1,2):
                if i + m >= 0 and i + m < img.shape[0] and j + n >= 0 and j + n < img.shape[1]:
                    gray = img[i + m, j + n]
                    collect.append(gray)
        collect.sort()
        if(len(collect) != 0):
            dat[i,j] = collect[len(collect) // 2]
cv2.imshow('dat', dat)
cv2.waitKey(0)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/268845
推荐阅读
相关标签
  

闽ICP备14008679号