文章目录
- 1、绘制图片RGB直方图
-
- 1.1、彩色图片
-
- 1.1.1、cv2.calcHist()方法
- 1.1.2、数组法
- 1.2、灰色图片
- 2、直方图均衡化
-
- 2.1、灰度图片均衡化
- 2.2、彩色图片均衡化
- 2.3、YUV均衡化
- 3、图片修补
-
- 4、亮度增强
- 5、磨皮美白
- 6、高斯滤波
- 7、均值滤波
- 8、中值滤波
1、绘制图片RGB直方图
1.1、彩色图片
1.1.1、cv2.calcHist()方法
- cv2.calcHist()方法
- 参数: 1、图片数据; 2、直方图的通道,[0]为灰度; 3、蒙板; 4、分成多少分,256组灰度值;5、直方图中各个像素的值[0.0,255.0]
import cv2
import numpy as np
def ImageHist(image, type):
color = (255, 255, 255)
windowName = 'Gray'
if type == 31:
color = (255, 0, 0)
windowName = 'B Hist'
elif type == 32:
color = (0, 255, 0)
windowName = 'G Hist'
elif type == 33:
color = (0, 0, 255)
windowName = 'R Hist'
hist = cv2.calcHist([image], [0], None, [256], [0.0, 255.0])
minV, maxV, minL, maxL = cv2.minMaxLoc(hist)
histImg = np.zeros([256, 256, 3], np.uint8)
for h in range(256):
intenNormal = int(hist[h]*256 / maxV)
cv2.line(histImg, (h, 256), (h, 256-intenNormal), color)
cv2.imshow(windowName, histImg)
return histImg
img = cv2.imread('image.jpg', 1)
channels = cv2.split(img)
for i in range(0, 3):
ImageHist(channels[i], 31+i)
cv2.waitKey(0)
cv2.destroyAllWindows()
![图像处理之opencv图像美化_第1张图片](http://img.e-com-net.com/image/info8/c846ae945ba543cd96ca7a0385ea2203.jpg)
1.1.2、数组法
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('image.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
count_b = np.zeros(256, np.float)
count_g = np.zeros(256, np.float)
count_r = np.zeros(256, np.float)
for i in range(0, height):
for j in range(0, width):
(b, g, r) = img[i, j]
index_b = int(b)
index_g = int(g)
index_r = int(r)
count_b[index_b] = count_b[index_b] + 1
count_g[index_g] = count_g[index_g] + 1
count_r[index_r] = count_r[index_r] + 1
x = np.linspace(0, 255, 256)
y1 = count_b
plt.figure()
plt.bar(x, y1, 0.9, alpha=1, color='b')
y2 = count_g
plt.figure()
plt.bar(x, y2, 0.9, alpha=1, color='g')
y3 = count_r
plt.figure()
plt.bar(x, y3, 0.9, alpha=1, color='r')
plt.show()
![图像处理之opencv图像美化_第2张图片](http://img.e-com-net.com/image/info8/e30f3c2805724d8690df56f1b13a4d2f.jpg)
![图像处理之opencv图像美化_第3张图片](http://img.e-com-net.com/image/info8/2151d0c5891041bebb087c71785052ae.png)
![图像处理之opencv图像美化_第4张图片](http://img.e-com-net.com/image/info8/af0c699708754c1ab871a8179201095f.jpg)
1.2、灰色图片
- 本质: 统计每个像素灰度出现的概率,值在 0~255 之间。
import cv2
import numpy as np
img = cv2.imread('damaged.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
paint = np.zeros((height, width, 1), np.uint8)
for i in range(100, 200):
paint[i , 100] = 255
paint[i , 100+1] = 555
paint[i , 100-1] = 255
for i in range(50, 150):
paint[150, i] = 255
paint[150+1, i] = 255
paint[150-1, i] = 255
cv2.imshow('paint', paint)
imgDst = cv2.inpaint(img, paint, 3, cv2.INPAINT_TELEA)
cv2.imshow('image', imgDst)
cv2.waitKey(0)
cv2.destroyAllWindows()
![图像处理之opencv图像美化_第5张图片](http://img.e-com-net.com/image/info8/c461a059ba20474c97adbf88dd45432c.jpg)
2、直方图均衡化
2.1、灰度图片均衡化
import cv2
import numpy as np
img = cv2.imread('image.jpg', 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray', gray)
dst = cv2.equalizeHist(gray)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
![图像处理之opencv图像美化_第6张图片](http://img.e-com-net.com/image/info8/0cee2eb717a04d8386cc5755129cfce2.jpg)
2.2、彩色图片均衡化
import cv2
import numpy as np
img = cv2.imread('image.jpg', 1)
cv2.imshow('Img', img)
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
result = cv2.merge((bH, gH, rH))
cv2.imshow('dst', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
![图像处理之opencv图像美化_第7张图片](http://img.e-com-net.com/image/info8/5b74de3397e1468bb880a0907b5159c1.jpg)
2.3、YUV均衡化
import cv2
import numpy as np
img = cv2.imread('image.jpg', 1)
cv2.imshow('src', img)
imgYUV = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
channelYUV = cv2.split(imgYUV)
channelYUV[0] = cv2.equalizeHist(channelYUV[0])
channels = cv2.merge(channelYUV)
result = cv2.cvtColor(channels, cv2.COLOR_YCrCb2BGR)
cv2.imshow('dst', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
![图像处理之opencv图像美化_第8张图片](http://img.e-com-net.com/image/info8/c8575ceff6934646a360f7c67d5533fe.jpg)
3、图片修补
3.1、图片损坏
import cv2
import numpy as np
img = cv2.imread('image.jpg', 1)
for i in range(100, 200):
img[i , 100] = (255, 255, 255)
img[i , 100+1] = (255, 255, 255)
img[i , 100-1] = (255, 255, 255)
for i in range(50, 150):
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.destroyAllWindows()
![图像处理之opencv图像美化_第9张图片](http://img.e-com-net.com/image/info8/5760b4183a0247d9bacb3b08e575eb37.jpg)
3.2、图片修复
import cv2
import numpy as np
img = cv2.imread('damaged.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
paint = np.zeros((height, width, 1), np.uint8)
for i in range(100, 200):
paint[i , 100] = 255
paint[i , 100+1] = 555
paint[i , 100-1] = 255
for i in range(50, 150):
paint[150, i] = 255
paint[150+1, i] = 255
paint[150-1, i] = 255
cv2.imshow('paint', paint)
imgDst = cv2.inpaint(img, paint, 3, cv2.INPAINT_TELEA)
cv2.imshow('image', imgDst)
cv2.waitKey(0)
cv2.destroyAllWindows()
![图像处理之opencv图像美化_第10张图片](http://img.e-com-net.com/image/info8/076dfa103e3a416da2e00129fec812d4.jpg)
4、亮度增强
import cv2
import numpy as np
img = cv2.imread('image.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height, width, 3), np.uint8)
for i in range(0, height):
for j in range(0, width):
(b, g, r) = img[i, j]
bb = int(b) + 40
gg = int(g) + 40
rr = int(r) + 40
if bb > 255:
bb = 255
if gg > 255:
gg = 255
if rr > 255:
rr = 255
dst[i, j] = (bb, gg, rr)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
![图像处理之opencv图像美化_第11张图片](http://img.e-com-net.com/image/info8/3857797f0dfe4519bbc81fd1578c5a0e.jpg)
5、磨皮美白
import cv2
img = cv2.imread('face.jpg', 1)
cv2.imshow('face', img)
dst = cv2.bilateralFilter(img, 15, 35, 35)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
![图像处理之opencv图像美化_第12张图片](http://img.e-com-net.com/image/info8/fb9be3428a19434ba201c464b4c67032.jpg)
6、高斯滤波
import cv2
import numpy as np
img = cv2.imread('image.jpg', 1)
cv2.imshow('face', img)
dst = cv2.GaussianBlur(img, (5,5), 1.5)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
![图像处理之opencv图像美化_第13张图片](http://img.e-com-net.com/image/info8/ce56eaaaa5ea464fbf1657fd8d13de95.jpg)
7、均值滤波
- 均值: 6*6 的模板,权重为1;[ 6 * 6] / 36 = mean 替换 原像素
import cv2
import numpy as np
img = cv2.imread('image.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height, width, 3), np.uint8)
for i in range(3, height-3):
for j in range(3, width-3):
sum_b = int(0)
sum_g = int(0)
sum_r = int(0)
for m in range(-3, 3):
for n in range(-3, 3):
(b, g, r) = img[i+m, j+n]
sum_b = sum_b + int(b)
sum_g = sum_g + int(g)
sum_r = sum_r + int(r)
b = np.uint8(sum_b / 36)
g = np.uint8(sum_g / 36)
r = np.uint8(sum_r / 36)
dst[i, j ] = (b, g, r)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
![图像处理之opencv图像美化_第14张图片](http://img.e-com-net.com/image/info8/8d56c79dbd1b4cd582a5a43568656543.jpg)
8、中值滤波
import cv2
import numpy as np
img = cv2.imread('image.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
cv2.imshow('src', img)
collect = np.zeros(9, np.uint8)
dst = np.zeros((height, width, 3), np.uint8)
for i in range(1, height-1):
for j in range(1, width-1):
k = 0
for m in range(-1, 2):
for n in range(-1, 2):
gray = img[i+m, j+n]
collect[k] = gray
k = k+1
for k in range(0, 9):
p1 = collect[k]
for t in range(k+1, 9):
if p1 < collect[t]:
mid = collect[t]
p1 = mid
dst[i, j] = collect[4]
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
![图像处理之opencv图像美化_第15张图片](http://img.e-com-net.com/image/info8/6576d8fe55394054a1fd96617d4ecda2.jpg)