9- OpenCV+TensorFlow 入门人工智能图像处理-8- OpenCV+TensorFlow 入门人工智能图像处理-图像修复

图像美化

  • 案例1: 直方图
  • 案例2: 直方图均衡化
  • 案例3: 亮度增强
  • 案例4: 磨皮美白
  • 案例5: 图片滤波
  • 案例6: 高斯滤波

颜色等级的直方图。

mark

图片滤波

mark

这一章节所有的知识点都比较复杂,也就是难度更高一点。

适用性更强,使用案例常见。

直方图均衡化,磨皮美白算法。

mark

Rgb三种颜色直方图,有横纵两个左边,横坐标描述0-255颜色等级(8位颜色)

纵坐标是每个颜色等级在整张图出现的概率(0-1)。

直方图均衡化?

一幅图上RGb的直方图没有均匀分布,而是集中在了某一处。 这时可以用直方图均衡化,让原本聚合在一起的直方图尽可能的离散化。

有灰度图像的直方图和彩色图像的直方图两种。

mark

经过图片直方图均衡化,图片的亮度和清晰度给人的感觉就要好很多。

mark

无论灰色还是彩色。

图像修复

因为某些原因图像造成了污损。可以采用这种方式进行修补

mark

在图像修补时要准备一个蒙版的图片,左下角这张黑色图片。 这张图片要尽可能的描述受损区域。

亮度增强

最简单的图像美化

mark

当前的灰度值,全部加上一个灰度等级。或者将当前的灰度值乘以一个放大系数。

这个效果是不分差异的增加整个图片的亮度

磨皮美白

mark

左图是未经过磨皮美白之前的,右图是经过美白后。这里采用一个双边过滤器实现。

图片滤波

  • 高斯滤波,中值滤波,均值滤波

一维高斯:

mark

高斯滤波将使用opencv api的形式

二维高斯:

mark

中值滤波使用源代码形式

图像卷积

mark

实质是矩阵对应点相乘并求和。

彩色图片直方图

api调用

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'
        
    # 调用opencv api完成hist方法
    # 参数1 image 注意加上[] 变成一个list 
    # 参数2 channels 通道 灰度直方图,下标[0] 
    # 参数3 mask None 蒙版
    # 参数4 histSize 绘制直方图个数 256  
    # 参数5 ranges 0-255
    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):
        # 归一化数据,获取每一个直方图的数据*256 除以最大值。值会被归到0-256之间
        intenNormal = int(hist[h]*256/maxV)
        # 1. 画布;2.起点 3. 256 - 归一化之后的值 
        cv2.line(histImg,(h,256),(h,256-intenNormal),color)
    cv2.imshow(windowName,histImg)
    return histImg
img = cv2.imread('image0.jpg',1)
# 将图片分层,RGB
channels = cv2.split(img)# RGB - R G B
for i in range(0,3):
    ImageHist(channels[i],31+i)
cv2.waitKey(0)

mark

minMaxLoc求出最大值最小值,以便我们进行归一化。

直方图均衡化

灰度图片直方图均衡化

#灰度 直方图均衡化
import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
# 灰度化
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('src',gray)

# equalizeHist 灰度图直方图均匀化
dst = cv2.equalizeHist(gray)
cv2.imshow('dst',dst)
cv2.waitKey(0)

mark

彩色图片直方图均衡化

# 彩色 直方图均衡化
import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
cv2.imshow('src',img)

# 对于单通道进行直方图均衡化
(b,g,r) = cv2.split(img)# 通道分解
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)

# merge合并三个通道
result = cv2.merge((bH,gH,rH))# 通道合成
cv2.imshow('dst',result)
cv2.waitKey(0)

mark

先分解通道,对于每个单一通道进行equalizeHist()之后,再将这些处理后的通道数据进行merge 合并。

实现YUV 直方图均衡化

# YUV 直方图均衡化
import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)

# 灰色图片转换为YCrCb(YUV)
imgYUV = cv2.cvtColor(img,cv2.COLOR_BGR2YCrCb)
cv2.imshow('src',img)

# 对图片进行分解,会得到一个三维的数组
channelYUV = cv2.split(imgYUV)
# 对第一维进行直方图均衡化
channelYUV[0] = cv2.equalizeHist(channelYUV[0])
# 再将这三个通道进行合并
channels = cv2.merge(channelYUV)

# 再将YUV转为BGR
result = cv2.cvtColor(channels,cv2.COLOR_YCrCb2BGR)
cv2.imshow('dst',result)
cv2.waitKey(0)

mark

图片修补

  1. 生成坏图片
import cv2 
import numpy as np
img = cv2.imread('image0.jpg',1)

# 画一条线从200画到300
for i in range(200,300):
    # 线宽三个像素
    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[250,i] = (255,255,255)
    img[250+1,i] = (255,255,255)
    img[250-1,i] = (255,255,255)
# 写入图片,破图
cv2.imwrite('damaged.jpg',img)
cv2.imshow('image',img)
cv2.waitKey(0)

mark

# 1 坏图 2 array描述图片坏哪里了 3 inpaint
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(200,300):
    # 改为单通道的
    paint[i,200] = 255
    paint[i,200+1] = 255
    paint[i,200-1] = 255
for i in range(150,250):
    paint[250,i] = 255
    paint[250+1,i] = 255
    paint[250-1,i] = 255
cv2.imshow('paint',paint)

# 1 src 2 mask
imgDst = cv2.inpaint(img,paint,3,cv2.INPAINT_TELEA)

cv2.imshow('image',imgDst)
cv2.waitKey(0)

定义一个蒙版,并调用inpaint方法。

参数1 原图片,参数2 蒙版图片,参数3 inpaintRadius修复的半径
参数4 flag 哪种修复

mark

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据挖掘DT机器学习

R语言主成分和因子分析

主成分分析(PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量称为主成分。 探索性因子分析(EFA)是一系列用来发现一组变...

3824
来自专栏AI研习社

史上最好记的神经网络结构速记表(上)

翻译 / 陈俊雅 校对 / 李傲 整理 / 雷锋字幕组 本文提供了神经网络结构速查表,盘点了神经网络的大量框架,并绘制了直观示意图进行说明,是人手必备的神经网络...

38412
来自专栏大数据挖掘DT机器学习

比较R语言机器学习算法的性能

原文:Compare The Performance of Machine Learning Algorithms in R 译文:http://g...

3316
来自专栏刘笑江的专栏

Loss Function

2064
来自专栏杨熹的专栏

神经网络的前世

小长假来听听 NN 的故事吧。 本文参考:这个地址不错,深入浅出讲深度学习的,推荐感兴趣的朋友看一下。 当你听到深度学习,你想到了什么? ? ? ? Deep...

3445
来自专栏数据科学学习手札

(数据科学学习手札17)线性判别分析的原理简介&Python与R实现

之前数篇博客我们比较了几种具有代表性的聚类算法,但现实工作中,最多的问题是分类与定性预测,即通过基于已标注类型的数据的各显著特征值,通过大量样本训练出的模型,来...

65010
来自专栏ATYUN订阅号

如何计算McNemar检验,比较两种机器学习分类器

在1998年被广泛引用的论文中,Thomas Dietterich在训练多份分类器模型副本昂贵而且不切实际的情况下推荐了McNemar检验。

1052
来自专栏贾志刚-OpenCV学堂

OpenCV中BLOB特征提取与几何形状分类

OpenCV中BLOB特征提取与几何形状分类 一:方法 二值图像几何形状提取与分离,是机器视觉中重点之一,在CT图像分析与机器人视觉感知等领域应用广泛,Open...

52112
来自专栏用户3246163的专栏

2.3 模型相关

covariance stationary:一个时间序列,均值,方差,协方差不随时间而变化 上面的模型都和两维度有关: 1. 数据相互关联的程度 2. 稳定性

1342
来自专栏大数据挖掘DT机器学习

数据处理的统计学习(scikit-learn教程)

Scikit-learn 是一个紧密结合Python科学计算库(Numpy、Scipy、matplotlib),集成经典机器学习算法的Python模块。 一、统...

4925

扫码关注云+社区