图像处理实战

2018-04-06 09:45:48 dongjiebox 阅读数 10662

本文转自知乎专栏:https://zhuanlan.zhihu.com/p/32177354

一方面为做资料整理用,方便后期回顾,另一方面转需

--------------------------------------------------

第一个重境界: 图像识别

如果你开始了解深度学习的图像处理, 你接触的第一个任务一定是图像识别 :比如把你的爱猫输入到一个普通的CNN网络里, 看看它是喵咪还是狗狗。

一个最普通的CNN, 比如像这样几层的CNN鼻祖Lenet, 如果你有不错的数据集(比如kaggle猫狗大战)都可以给出一个还差强人意的分类结果(80%多准确率), 虽然不是太高。

当然,如果你再加上对特定问题的一些知识, 也可以顺便识别个人脸啥的,开个startup叫face 减减什么:

会玩的, 也可以顺别识别个猪脸什么哒(我觉得长得都一样哦), 这样搞出来每个猪的身份, 对于高质量猪肉的销售, 真是大有裨益的。

或者看看植物都有个什么病害什么的,像这样不同的病斑, 人都懒得看的, 它可以给你看出来。 植物保护的人可以拿着手机下田了。

Ronneberger, Olaf, Philipp Fischer, and Thomas Brox. "U-net: Convolutional networks for biomedical image segmentation." International Conference on Medical Image Computing and Computer-Assisted Intervention. Springer, Cham, 2015.

虽然植物保护真的很好用,分类问做就了还真是挺无聊的。

我们进化的方向,也就是用更高级的网络结构取得更好的准确率,比如像下图这样的残差网络(已经可以在猫狗数据集上达到99.5%以上准确率)。分类做好了你会有一种成为深度学习大师,拿着一把斧子眼镜里都是钉子的幻觉。 分类问题之所以简单, 一要归功于大量标记的图像, 二是分类是一个边界非常分明的问题, 即使机器不知道什么是猫什么是狗, 看出点区别还是挺容易的, 如果你给机器几千几万类区分, 机器的能力通过就下降了(再复杂的网络,在imagenet那样分1000个类的问题里,都很难搞到超过80%的准确率)。

He, Kaiming, et al. "Identity mappings in deep residual networks." European Conference on Computer Vision. Springer International Publishing, 2016.

第二重境界 : 物体检测

很快你发现,分类的技能在大部分的现实生活里并没有鸟用。因为现实中的任务啊, 往往是这样的:

或者这样的:

那么多东西在一起,你拿猫狗大头照训练的分类网络一下子就乱了阵脚。 即使是你一个图片里有一个猫还有一个狗,甚至给猫加点噪声,都可以使你的分类网络分寸大乱。

现实中, 哪有那么多图片, 一个图里就是一个猫或者美女的大图,更多的时候, 一张图片里的东西, 那是多多的, 乱乱的,没有什么章法可言的, 你需要自己做一个框, 把你所需要看的目标给框出来, 然后, 看看这些东西是什么 。

于是你来到机器视觉的下一层挑战 - 目标检测(从大图中框出目标物体并识别), 随之而来的是一个新的网络架构, 又被称为R - CNN, 图片检测网络 , 这个网络不仅可以告诉你分类,还可以告诉你目标物体的坐标, 即使图片里有很多目标物体, 也一一给你找出来。

Ren, Shaoqing, et al. "Faster R-CNN: Towards real-time object detection with region proposal networks." Advances in neural information processing systems. 2015.

万军斩你首级那是杠杠的,在众多路人甲中识别嫌疑犯,也是轻而易举, 安防的人听着要按捺不住了。

今年出现的YOLO算法更是实现了快速实时的物体检测,你一路走过就告诉你视线里都有什么在哪里,要知道这在无人驾驶里是何等的利器。

YOLO快速检测法Redmon, Joseph, et al. "You only look once: Unified, real-time object detection." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016.

当然, 到这里你依然最终会觉得无聊, 即使网络可以已经很复杂, 不过是一个CNN网络(推荐区域),在加上一层CNN网络做分类和回归。 能不能干点别的?

第三重境界 : 图像切割

啊哈, 这就来到了第三个关卡, 你不仅需要把图片中边边角角的物体给检测出来, 你还要做这么一个猛料的工作, 就是把它从图片中扣出来。 要知道, 刚出生的婴儿分不清物体的边界, 比如桌上有苹果这种事, 什么是桌子,什么是苹果,为什么苹果不是占在桌子上的? 所以, 网络能不能把物体从一个图里抠出来, 事关它是否真的像人一样把握了视觉的本质。 这也算是对它的某种“图灵测试” 。 而把这个问题简化,我们无非是在原先图片上生成出一个原图的“mask”, 面具,有点像phtoshop里的蒙版的东西。

所谓抠图

Drozdzal, Michal, et al. "The importance of skip connections in biomedical image segmentation." International Workshop on Large-Scale Annotation of Biomedical Data and Expert Label Synthesis. Springer International Publishing, 2016.

注意,这个任务里,我们是要从一个图片里得到另一个图片哦! 生成的面具是另一个图片, 这时候,所谓的U型网络粉墨登场,注意这是我们的第一个生成式的模型。 它的组成单元依然是卷积,但是却加入了maxpooling的反过程升维采样。

这个Segmentation任务, 作用不可小瞧哦, 尤其对于科研口的你, 比如现在私人卫星和无人机普及了,要不要去看看自己小区周围的地貌, 看是不是隐藏了个金库? 清清输入, 卫星图片一栏无余。 哪里有树, 哪里有水,哪里有军事基地,不需要人,全都给你抠出来。

如果你要数个细胞啥的 ,都是挺容易的,给它变成这样的轮廓不就你得了。

第四重境界:

我们开始fashion起来, 如果你是淘宝服装小店的老板 ,想让客户输入一张服装的图片,然后得到一组推荐的服装, 来个以图搜图的功能怎么搞呢? 注意啊,我可以从网络上爬一大堆图出来,但是这些数据是没有标注的。怎么办? 铁哥告你还是有的搞,这个搞法,就是聚类。

铁哥教你最简单的一招聚类哦,那就是, 把图片统统放进卷积网络,但是我们不提取分类,而只是提取一些网络中间层的特征, 这些特征有点像每个图片的视觉二维码,然后我们对这些二维码做一个k-means聚类, 也会得到意想不到的效果。 为什么要深度? 因为深度提取的特征,那是与众不同的。

然后以图搜图呢? 不过是找到同一聚类里的其它图片啊。

在聚类的基础上, 就可以做个搜索!

第五层境界 :

我们开始晋升为仰望星空的人, 之前那些分类赚钱的应用太无聊了。 机器视觉搞科学怎么港? 作为一群仰望星空后观察细胞的人,我们最常发现的是我们得到的天文或者细胞图片的噪声实在太大了, 这简直没法忍啊, 然后, 深度学习给了你一套降噪和恢复图像的方法。 一个叫auto-encoder的工具, 起到了很大的作用 , 刷的一下,图像就清楚了。

这还不是最酷炫的,那个应用了博弈理论的对抗学习, 也可以帮你谋杀噪点! 如果你会对抗所谓GAN, 也是一种图像生成的工具, 让网络去掉噪声的图片,与没有噪声的自然图片, 连卷积网络都判别不出来,对, 就是这样!

Schawinski, Kevin, et al. "Generative adversarial networks recover features in astrophysical images of galaxies beyond the deconvolution limit." Monthly Notices of the Royal Astronomical Society: Letters 467.1 (2017): L110-L114.

第六重境界 :

在工业界赚够了钱,科学也太nerd了, 我们来玩艺术思考哲学 ,第一招, 图像风格迁移,请见怎么样用深度学习取悦你的女朋友(有代码):

然而真正能玩好这一事项的,还是那个刚刚提过的对抗学习GAN, 比如大名鼎鼎的CycleGAN, 几乎可以实现一种你自定义的“图像翻译” 功能,而且你不用做标注哦, 拿出冬天和夏天的两组图片, 它会自动的在两组图片中找出对应来。

Zhu, Jun-Yan, et al. "Unpaired image-to-image translation using cycle-consistent adversarial networks." arXiv preprint arXiv:1703.10593 (2017).

第七重境界:

图像翻译也懒的玩了, 你神经网络不是号称能够理解图像,看你来个无中生有,在噪声里生成图片来?

对,依然是GAN,而且是最基础的卷积GAN (DCGAN)就可以给你干出来。

看看GAN所幻想的宾馆情景, 你能想到是计算机做的图吗? 哈哈哈!

Goodfellow, Ian, et al. "Generative adversarial nets." Advances in neural information processing systems. 2014.

写到这里, 我自己都觉得GAN是非常有前途的,有前途的,有前途的,以前我还以为只是好玩呢。

这里展示的七级浮屠,也不过深度学习被人类discover的冰山一角, 醉卧沙场君莫笑, 古来征战几人回。

给你一个稍微清晰一些的大纲:


2020-05-10 09:53:42 weixin_43717681 阅读数 58

pillow图像处理库

PIL(Python Imaging Library)是Python常用的图像处理库,但PIL仅支持到Python2.7,后一群志愿者在PIL的基础上创建了PIL的兼容版本Pillow

Pillow提供了广泛的文件格式支持,强大的图像处理能力,主要包括图像存储、图像显示、格式转换以及基本的图像处理操作等

Pillow扩展库主要功能

图像归档

对图像进行批处理、生成图像预览、图像格式转换等

图像处理

图像基本处理、像素处理、颜色处理

Pillow扩展库主要操作

在PIl中,任何一个图像文件都可以用Image对象表示

Image类的图像读取和创建方法

方法 描述
Image.open(filename) 根据参数加载图像文件
Image.new(mode,size,color) 根据给定参数创建一个新的图像
Image.open(StringIO,StringIO(buffer)) 从字符串中获取图像
Image.frombytes(mode,size,data) 根据像素点data创建图像
Image.verify 对图像文件完整性进行检查,返回异常

Image类有4个处理图片的常用属性

属性 描述
Image.format 表示图像格式或来源,如果图像不是从文件读取,值是none
Image.mode 图像的色彩模式,“L”灰度图像,“RGB”真彩色图像,“CMYK”出版图像
Image.size 图像宽度和高度,单位是像素点(px),返回值是二元元祖(tuple)
Image.palette 调色板属性,返回一个ImagePalette类型

Image类的图像转换和保存方法

方法 描述
Image.save(filename,format) 将图像保存为filename文件名,format是图片格式
Image.convert(mode) 使用不同的参数,转换为图像为新的模式
Image.thumbnail(size) 常见图像的缩略图,size是缩略图尺寸的二元元祖

生成缩略图,128*128是尺寸

from PIL import Image
im=Image.open("头像(1).jpg")
im.thumbnail((128,128))
im.save("img1","JPEG")

Image类能够对每个像素点或者一幅RGB图像的每个通道单独进行操作,split()方法能够将RGB图像个颜色通道提取出来,merge()方法能够将各独立通道再合成一幅新的图像。

方法 描述
Image.point(func) 根据函数func功能对每个元素进行运算,返回图像副本
Image.split() 提取rgb图像的每个颜色通道,返回图像副本
Image.merge(mode,bands) 合并通道,采用mode色彩,bands是新色的色彩通道
Image.blend(im1,im2,alpha)

将两幅图片im1和im2按照如下公式插值后生成洗呢图像:im1*(1.0-alpha)+im2*alpha

颜色变换 

from PIL import Image
im=Image.open("1.jpg")
r,g,b=im.split()
om=Image.merge("RGB",(b,g,r))#对RGB的颜色进行了调换
om.save('2.jpg')

PIL库的ImageFilter提供的过滤图像方法

方法表示 描述
ImageFilter.BLUR 图像的模糊效果
ImageFilter.CONTOUR 图像的轮廓效果
ImageFilter.DETALL 图像的细节效果
ImageFilter.EDGE_ENHANCE 图像的边界加强效果
ImageFilter.EDGE_ENHANCE_MODE 图像的阈值边界加强效果
ImageFilter.EMBOSS 图像的浮雕效果
ImageFilter.FIND_EDGES 图像的边界效果
ImageFilter.SMOOTH 图像的平滑效果
ImageFilter.SMOOTH_MORE 图像的阈值平滑效果
ImageFilter.SHARPEN 图像的锐化效果

生成图像模糊效果:套用滤镜

from PIL import Image
from PIL import ImageFilter

im=Image.open("1.jpg")
om=im.filter(ImageFilter.BLUR)
#为图片使用模糊滤镜
om.save("3.jpg")

PIL库的ImageEnhance类提供了更高级的图像增强效果,提供调整色彩度、亮度、对比度、锐化等功能。

方法 描述
ImageEnhance.enhance(factor) 对选择属性的数值增强factor值
ImageEnhance.Color(im) 调整图像的颜色平衡
ImageEnhance.Contrast(im) 调整图像的对比度
ImageEnhance.Brightness(im) 调整图像的亮度
ImageEnhance.Sharpness(im) 调整图像的锐度

高级图像增强实例

from PIL import Image
from PIL import ImageEnhance

im=Image.open("1.jpg")

#调整图像对比库
om=ImageEnhance.Contrast(im)
#图像对比度增强3倍
om.enhance(3).save("4.jpg")

随机生成验证码

from PIL import Image,ImageDraw,ImageFont,ImageFilter
import random

# 随机字母:(65-90表示26个大写英文字母)
def rndChar():
    return chr(random.randint(65, 90))

# 随机颜色1:验证码背景颜色
def rndColor():
    return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))

# 随机颜色2:文本颜色
def rndColor2():
    return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))

 # 240 x 60:
width = 60 * 4
height = 60
image = Image.new('RGB', (width, height), (255, 255, 255))
# 创建Font对象:
font = ImageFont.truetype('arial.ttf', 36)
# 创建Draw对象:
draw = ImageDraw.Draw(image)
# 填充每个像素:
for x in range(width):
    for y in range(height):
        draw.point((x, y), fill=rndColor())#fill随机颜色
# 输出文字:
for t in range(4):
    draw.text((60 * t + 10, 10), rndChar(), font=font, fill=rndColor2())
# 模糊:
image = image.filter(ImageFilter.BLUR)
image.save('code.jpg', 'jpeg')

 

2018-08-21 23:42:55 alvin93 阅读数 1930

2017-6 水下机器人视觉系统图像处理研究_仝灼银 
1.利用算法提高图像清晰度 
2.建立物理模型

(1)空域增强算法:直方图处理、对比度调整、图像分割——最热 
优化:部分统计加强、局部直方图调整、基于限制的混合对比度自适应直方图等

(2)频域增强算法:傅里叶变换、高斯滤波 
同态滤波、高斯滤波、高通滤波、选通滤波、小波变换—基于频域和时域,弥补傅里叶变换的不足,但有振铃现象。

(3)颜色恒常理论算法:白平衡理论 
(4)混合方法:前三种方法融合

自适应直方图均衡化—AHE,会出现过度增强噪点 
对比度限制的自适应直方图均衡化—CLAHE

清晰度评价方法 
均方误差—MSE 
峰值信噪比—PSNR

算法实现: 
图像从RGB空间经过算法处理分别变换到HSV和Lab颜色模型。再图像变换道HSV空间后,对V通道进行处理,再进行CLAHE算法处理,低照度部分将被增强,有效提升原图像的整体对比度。同时,采用加权方法对高频部分进行适当削弱,用来增强图像细节信息的对比度。在图像变换到Lab空间后,利用CLAHE算法对L通道进行处理,得到加强后的图片处理结果。

2019-05-07 14:39:17 u013699471 阅读数 300

图像预处理

更多精彩内容请关注微信公众号:听潮庭
在这里插入图片描述
写在前面:

  1. 图像显示与存储原理
  2. 图像增强的目标
  3. 点运算:基于直方图的对比度增强
  4. 形态学处理
  5. 空间与处理:卷积
  6. 卷积的应用(平滑、边缘检测、锐化等)
  7. 频率域处理:傅里叶变换,小波变换
  8. 应用案例:平滑、边缘检测、CLAHE等

一、颜色空间

1、RGB颜色空间

  • 加法混色(越叠加越白:255,255,255=白色),彩色显示
  • 3个通道 (后面提到一张图片有三个维度,长,宽和通道(r,g,b))
    • Red通道
    • Green通道
    • Blue通道
  • 一个像素颜色值
    • (b,g,r)
  • 取值范围
    • [0, 255]
    • [0.0, 1.0]

2、CMYK颜色空间

  • 减法混色,多用于印刷
  • 4通道
    • Cyan通道
    • Magenta通道
    • Yellow通道
    • Key通道
  • 一个像素颜色值
    • (c,y,m,k)
  • 取值范围
    • [0, 255]
    • [0.0, 1.0]

3、HSV颜色空间

  • 人类视觉概念,画家配色
  • 3各要素
    • H/Hue:色调,颜色种类
    • S/Saturation:饱和度,颜色的纯度
    • V/Value:明度,颜色明亮度
  • 一个像素颜色值
    • (h,s,v)
  • 取值范围
    • [0, 255]
    • [0.0, 1.0]

4、CIE-XYZ颜色空间

  • 国际照明协会,1931
  • 基于人类颜色视觉的直接测定
  • 其他颜色空间基础
  • 人类视觉系统-视锥细胞
    • 短波(S,420-440nm)
    • 中波(M,530-540nm)
    • 长波(L,560-580nm)
  • 3色刺激值通道
    • X,Y,Z约略对应于红色,绿色,蓝色
    • 一种波的刺激等于几种波的混合刺激

二、图片存储原理

1、主流颜色空间

  • RGB三通道彩色图

    • 图片->3维矩阵([0,255])

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

  • 单通道灰度图

    • 亮度信息[0,255]
    • Gray=R×0.3+G×0.59+B×0.11(常用的图片灰度化转换公式)

在这里插入图片描述

三、图像增强的目标

  1. 改善图像的视觉效果
  2. 转换为更适合人或机器分析处理的形式
  3. 突出对人或机器分析有意义的信息
  4. 抑制无用信息,提高图像的使用价值
  5. 具体包括图像锐化,平滑,去噪,灰度调整(对比度增强)

四、图像处理的方法

在这里插入图片描述

1、特征提取方法

  1. 直方图Histogram

    • 对图片数据/特征分布的一种统计
      • 灰度、颜色
      • 梯度/边缘、形状、纹理
      • 局部特征点、视觉词汇
    • 区间bin
      • 具有一定的统计或物理意义
      • 一种数据或特征的代表
      • 需要预定义或基于数据进行学习
      • 数值是一种统计量:概率、频数、
    • 对数据空间bin进行量化
  2. 直方图均衡化

    • 直方图均衡化是指:利用图像直方图对对比度进行调整德方法
    • 直方图均衡化通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比图相当接近的时候
    • 直方图均衡化以后,亮度可以更好的在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效的扩展常用的亮度来实现这种功能
    • 直方图均衡化:实质上是对图像进行非线性拉伸
    • 重新分配各个灰度单位中的像素点数量,是一定的灰度范围像素点数量的值大致相等
    • 在这里插入图片描述
  3. 自适应直方图均衡

    • 直方图均衡的经典算法对整幅图像的像素使用相同的变换,如果图像中包括明显亮的或者暗的区域,则经典算法有限
    • 自适应直方图均衡(AHE)算法通过对局部区域进行直方图均衡,来解决上述问题;
      • 移动模板在原始图片上按特定步长滑动
      • 每次移动后,模板区域内做直方图均衡,映射后的结果赋值给模板区域内所有点
      • 每个点会有多次赋值,最终的取值为这些赋值的均值。
  4. CLAHE

    • AHE会过度放大图像中相对均匀区域的噪声,可采用限制对比度自适应直方图均衡(CLAHE)。
    • 与普通自适应直方图均衡相比,CLAHE的不同地方在于直方图修剪过程,用修剪后的直方图均衡图像时,图像对比度会更自然
    • 在这里插入图片描述等面积挪到下面垫高
    • 如下图
    • 在这里插入图片描述
    • 小黑点的灰度直接由映射函数计算得到
    • 粉色区域内点的灰度由映射函数计算得到
    • 绿色区域内点的灰度由相邻两块灰度映射值线性插值得到
    • 其他区域所有点的灰度由相邻四块的灰度映射值双线性插值而得、
    • CLAHE算法步骤
      • 1、图像分块,以块为单位
      • 2、先计算直方图,然后修建直方图,最后均衡
      • 3、遍历操作各个图像块,进行块间双线性插值
      • 4、与原图做图层绿色混合操作。(可选)
  5. 形态学运算

    • 开运算:先腐蚀在膨胀,可以去掉目标外的孤立点
    • 闭运算:先膨胀再腐蚀,可以去掉目标内的孔
    • 通常,当有噪声的图像用阈值二值化后,所得到的边界是很不平滑的,物体区域具有一些错判的孔洞,背景区域散布着一些小的噪声物体,连续的开和闭运算可以显著的改善这种情况
  6. 空间域处理及其变换

    • 滤波/卷积
      • 在每个图片位置(x,y)上进行基于邻域的函数计算
        1. 滤波函数->权重相加
          • 卷积核、卷积模板
          • 滤波器、滤波模板
          • 扫描窗
      • 不同功能需要定义不同的函数
        1. 平滑/去噪
        2. 梯度/锐化
        3. 边缘、显著点、纹理
        4. 模式检测
    • 在这里插入图片描述
    • 参数解释
      • x,y是像素在图片中的位置/坐标
      • k,l是卷积核中的位置/坐标,中心点的坐标是(0,0)
      • f(k,l)是卷积核中在(k,l)上的权重参数
      • I(x+k,y+l)是与f(k,l)相对应的图片像素值
      • h(x,y)是图片中(x,y)像素的滤波/卷积结果
      • 在这里插入图片描述
        在这里插入图片描述
    • 边界填充(Padding) 将卷积核的中心对上顶点
      • 获得同尺寸输出的情况下
      • 卷积核越大,补充越多
    • 补充类型
      • 补零(zero-padding) 目前用的最多
      • 边界复制(replication)
      • 镜像(reflection)
      • 块复制(wraparound)
  7. 均值滤波

    • 平滑均值滤波/卷积

      • 3*3

      • 扫描步长:1

      • 边框补零

      • 在这里插入图片描述

      • 均值滤波本身存在缺陷,既没有很好的去除噪声点,也破坏了图像的细节反而使图像变得模糊

      • 奇数尺寸:3×3、5×5,7×7,2n-1×2n-1

      • 参数和为:1

      • 在这里插入图片描述

      • 在这里插入图片描述

  8. 平滑中值滤波/卷积

    • 奇数尺寸:3×3、5×5,7×7,2n-1×2n-1
    • 操作原理:
      • 卷积域内的像素值从小到大排序
      • 取中间值作为卷积输出
    • 有效去除椒盐噪声
    • 在这里插入图片描述
    • 将领域矩阵中的N个像素进行排序,并将这个矩阵的中心点赋值为这N个像素的中值
    • 在这里插入图片描述
  9. 平滑高斯滤波/卷积

    • 奇数尺寸:3×3、5×5,7×7,2n-1×2n-1

    • 模拟人眼,关注中心区域

    • 有效去除高斯噪声

    • 参数

      • x,y是卷积参数坐标
      • 标准差σ /`sigma/
      • 在这里插入图片描述
      • 人眼特性:离关注中心越远,感受精度越模糊
      • 在这里插入图片描述
      • σ 越小 关注区域越集中
      • 在这里插入图片描述
      • 分解特性(级联高斯)
        • 2D卷积拆分成两个相同的ID卷积
          • 列卷积
          • 行卷积
        • 降计算
          • 2D卷积:K×K次计算
          • 2×1D卷积:2K次计算
          • 在这里插入图片描述
            -在这里插入图片描述
  10. 梯度Prewitt滤波/卷积

    • 水平梯度/垂直边缘 梯度:某一函数在该点处的方向导数
    • 在这里插入图片描述
    • 垂直梯度/水平边缘
    • 在这里插入图片描述
  11. 梯度Laplacian滤波/卷积

    • 二阶微分算子
      • 一阶导数极值
      • 在这里插入图片描述
    • 作用
      • 团块检测:周边高于(低于)中心点
      • 边缘检测:像素值快速变化的区域
      • 在这里插入图片描述
        -在这里插入图片描述
      • Laplacian滤波器条件,相加等于0;
      • Laplacian滤波锐化
      • 在这里插入图片描述
  12. 其他滤波/锐化

    • 左移位滤波
      • 在这里插入图片描述
    • 锐化
      • 在这里插入图片描述
2019-07-21 16:18:50 weixin_43318717 阅读数 69

图像的自由缩放以及边缘裁剪

程序6-1:

import cv2

img = cv2.imread("lena.jpg")
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
turn_green_hsv = img_hsv.copy()
turn_green_hsv[:, :, 0] = (turn_green_hsv[:, :, 0] - 30) % 180#0色调 1饱和度 2明暗度
turn_green_img = cv2.cvtColor(turn_green_hsv, cv2.COLOR_HSV2BGR)
cv2.imshow("test", turn_green_img)
cv2.waitKey(0)

结果:
在这里插入图片描述
程序6-2:

import cv2

img = cv2.imread("lena.jpg")
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
less_color_hsv = img_hsv.copy()
less_color_hsv[:, :, 0] = less_color_hsv[:, :, 0] * 0.6
turn_green_img = cv2.cvtColor(less_color_hsv, cv2.COLOR_HSV2BGR)
cv2.imshow("test", turn_green_img)
cv2.waitKey(0)

结果:
在这里插入图片描述
程序6-3:

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = plt.imread("lena.jpg")
gamma_change = [np.power(x / 255, 0.4) * 255 for x in range(256)]#gamma变换
gamma_img = np.round(np.array(gamma_change)).astype(np.uint8)
img_corrected = cv2.LUT(img, gamma_img)
plt.subplot(121)
plt.imshow(img)
plt.subplot(122)
plt.imshow(img_corrected)
plt.show()

结果:
在这里插入图片描述
程序6-4:

import cv2
import numpy as np

img = cv2.imread("lena.jpg")
#仿射变换矩阵 图形缩小为原来80%,逆时针旋转90度,左移100,下移12
M_copy_img = np.array([
    [0, 0.8, -100],
    [0.8, 0, -12]
], dtype=np.float32)
img_change = cv2.warpAffine(img, M_copy_img, (300, 300))
cv2.imshow("test", img_change)
cv2.waitKey(0)

结果:
在这里插入图片描述
使用OpenCV扩大图像数据库

程序6-5:

#图像的随机裁剪
import cv2
import random

img = cv2.imread("lena.jpg")
width, height, depth = img.shape
img_width_box = width * 0.2
img_height_box = height * 0.2
for _ in range(9):
    start_pointX = int(random.uniform(0, img_width_box))
    start_pointY = int(random.uniform(0, img_height_box))
    copyImg = img[start_pointX:200, start_pointY:200]
    cv2.imshow("test", copyImg)
    cv2.waitKey(0)

结果:
在这里插入图片描述
程序6-6:

#图像的随机旋转变换
import cv2

img = cv2.imread("lena.jpg")
rows, cols, depth = img.shape
img_change = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 1)#依托中心,逆时针旋转角度,缩放倍数
res = cv2.warpAffine(img, img_change, (rows, cols))
cv2.imshow("test", res)
cv2.waitKey(0)

结果:
在这里插入图片描述
程序6-7:

#图像色彩的随机变换
import cv2
import numpy as np

img = cv2.imread("lena.jpg")
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
turn_green_hsv = img_hsv.copy()
turn_green_hsv[:, :, 0] = (turn_green_hsv[:, :, 0] + np.random.random()) % 180
turn_green_hsv[:, :, 1] = (turn_green_hsv[:, :, 1] + np.random.random()) % 180
turn_green_hsv[:, :, 2] = (turn_green_hsv[:, :, 2] + np.random.random()) % 180
turn_green_img = cv2.cvtColor(turn_green_hsv, cv2.COLOR_HSV2BGR)
cv2.imshow("test", turn_green_img)
cv2.waitKey(0)

结果:
在这里插入图片描述
程序:

#用鼠标在图片上画矩形框
import cv2
def draw_rectangle(event,x,y,flags,param):
    global ix, iy
    if event==cv2.EVENT_LBUTTONDOWN:
        ix, iy = x, y
        print("point1:=", x, y)
    elif event==cv2.EVENT_LBUTTONUP:
        print("point2:=", x, y)
        print("width=",x-ix)
        print("height=", y - iy)
        cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 2)

img = cv2.imread("lena.jpg")  #加载图片
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_rectangle)
while(1):
    cv2.imshow('image', img)
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()

结果:
在这里插入图片描述
程序6-8:

import cv2

def on_mouse(event,x,y,flags,param):
    global start_x,start_y
    global end_x,end_y
    if event==cv2.EVENT_LBUTTONDOWN:
        start_x=x
        start_y=y
        print("point1:=", start_x,start_y)
    elif event==cv2.EVENT_LBUTTONUP:
        end_x=x
        end_y=y
        print("point2:=", end_x,end_y)
        print("width=",end_x-start_x)
        print("height=",end_y-start_y)
        cv2.rectangle(img, (start_x,start_y), (end_x,end_y), (0, 255, 0), 2)

img = cv2.imread("lena.jpg")  #加载图片
cv2.namedWindow('image')
cv2.setMouseCallback('image', on_mouse)
while(1):
    cv2.imshow('image', img)
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()

结果:

point1:= 49 44
point2:= 191 205
width= 142
height= 161

在这里插入图片描述