赞
踩
首先得到一个损坏的图像:
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)
我们使用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)
原理:将原来的像素点数值增加来增强亮度
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)
样例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)
双边滤波(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] 通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
缺点:得到的图像会变得非常模糊
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)
均值滤波
均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围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)
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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。