【AI】CV基础1

定期更新,建议关注更新收藏。
本站友情链接:
OCR篇1
可变形卷积Deformable Conv
opencv-python形态学操作合集

仿射变换

仿射变换请点击标题链接打开内容。

图像二阶导数本质探讨

二阶导数比一阶导数有更好的细节增强表现。原理如下。
已知,图像是由矩阵(像素值、通道RGB)组合来表示的。当然这其中就会出现像素值的变化。
为了方便,常常把RGB图像转化成灰度图像,这其中会发现一些区域的灰度变化(灰度突变),这部分就可以看作是图像中的一部分轮廓边缘

在这里插入图片描述

以上公式是如何推导的呢?
首先根据导数的概念可知 f’x=df/dx,当Δ=1即f’x=f(x+1)-f(x)/1
二阶导数同理。f’‘x=f’(x+Δx)-f’(x)/Δx,
运用之前的推导的一阶式子,f’'x=[f(x+1)-f(x)-(f(x-1+1)-f(x-1))]/1=f(x+1)-f(x-1)-f(x) 带上y值的话没有什么区别影响,得到图片中第二个式子

对于一阶导数,除了灰度突变的地方,其它灰度缓慢变化的地方数值相同,而且符号也相同。
而二阶导数在灰度缓慢变化的地方数值为0,而在灰度突变的地方有符号相反的2个数值。也即二阶导数产生了一个像素宽的双边缘。这个可以找一个矩阵计算自行验证一下。

倘若用原图像素值 相对应的减去 二阶导数后的像素值,在灰度均匀或灰度缓慢变化的地方,图像并没有任何改变;但在灰度突变的边缘处,更加差值巨大。比如:原来是100和50的灰度差别,现在是150和10的灰度差别,对比度增强了很多。

因为二阶导数产生了一个像素宽的双边缘,且2个边缘的二阶导数值符号相反,因此在合并图像时,就要考虑符号的问题,不然就适得其反。如果像一阶导数那样,使用了绝对值,那么这种双边缘的对比反差就没有了,所以二阶导数也就没有使用绝对值。

二阶导数比一阶导数获得的物体边界更加细致。但是,显而易见的,二阶导数对噪声点也更加敏感,会放大噪声的影响。
在一片灰度均匀的区域,有一个噪声点(噪声之所以是噪声,本身其像素值就凸显于其他周围区域),经过二阶导数处理后,噪声点更加孤立明显了,尤其在这些灰度平滑区域更加的显眼,噪声被放大了。

PIL

PIL中所涉及的基本概念有如下几个:通道(bands)、模式(mode)、尺寸(size)、坐标系统(coordinate system)、调色板(palette)、信息(info)和滤波器(filters)。

通道、模式、尺寸、坐标系统、调色板、信息

每张图片都是由一个或者多个数据通道构成。PIL允许在单张图片中合成相同维数和深度的多个通道。以RGB图像为例,每张图片都是由三个数据通道构成,分别为R、G、B通道。而对于灰度图像,则只有一个通道。
对于一张图片的通道数量和名称,可以通过方法getbands()来获取。方法getbands()是Image模块的方法,它会返回一个字符串元组(tuple)。该元组将包括每一个通道的名称。

from PIL import Image
im= Image.open('abs_path')
im.getbands()

PIL中有九种不同模式。分别为1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。
图像的模式定义了图像的类型和像素的位宽。当前支持如下模式:
1:1位像素,表示黑和白,但是存储的时候每个像素存储为8bit。模式“1”为二值图像,非黑即白。但是它每个像素用8个bit表示,0表示黑,255表示白。

L:8位像素,表示黑和白。,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照公式转换的:L = R * 299/1000 + G * 587/1000+ B * 114/1000

P:8位像素,使用调色板映射到其他模式。模式“P”为8位彩色图像,它的每个像素用8个bit表示,其对应的彩色值是按照调色板查询出来的。

RGB:3x8位像素,为真彩色。

RGBA:4x8位像素,有透明通道的真彩色。它的每个像素用32个bit表示,其中24bit表示红色、绿色和蓝色三个通道,另外8bit表示alpha通道,即透明通道。

CMYK:4x8位像素,颜色分离。模式“CMYK”为32位彩色图像,它的每个像素用32个bit表示。模式“CMYK”就是印刷四分色模式,它是彩色印刷时采用的一种套色模式,利用色料的三原色混色原理,加上黑色油墨,共计四种颜色混合叠加,形成所谓“全彩印刷”。
四种标准颜色是:C:Cyan = 青色,又称为‘天蓝色’或是‘湛蓝’M:Magenta = 品红色,又称为‘洋红色’;Y:Yellow = 黄色;K:Key Plate(blacK) = 定位套版色(黑色)。
PIL中“RGB”转换为“CMYK”的公式如下:
C = 255 - R
M = 255 - G
Y = 255 - B
K = 0
由于该转换公式比较简单,转换后的图像颜色有些失真。

YCbCr:3x8位像素,彩色视频格式。
模式“YCbCr”为24位彩色图像,它的每个像素用24个bit表示。YCbCr其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量。人的肉眼对视频的Y分量更敏感,因此在通过对色度分量进行子采样来减少色度分量后,肉眼将察觉不到的图像质量的变化。
模式“RGB”转换为“YCbCr”的公式如下:(PIL并非按照这个来执行的)
Y= 0.257R+0.504G+0.098B+16
Cb = -0.148
R-0.291G+0.439B+128
Cr = 0.439R-0.368G-0.071*B+128

I:32位整型像素。32位整型灰色图像,它的每个像素用32个bit表示,0表示黑,255表示白,(0,255)之间的数字表示不同的灰度。在PIL中,从模式“RGB”转换为“I”模式是按照下面的公式转换的:
I = R * 299/1000 + G * 587/1000 + B * 114/1000

F:32位浮点型像素。为32位浮点灰色图像,它的每个像素用32个bit表示,0表示黑,255表示白,(0,255)之间的数字表示不同的灰度。在PIL中,从模式“RGB”转换为“F”模式是按照下面的公式转换的:
F = R * 299/1000+ G * 587/1000 + B * 114/1000
模式“F”与模式“L”的转换公式是一样的,都是RGB转换为灰色值的公式,但模式“F”会保留小数部分

PIL也支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)。

可以通过mode属性读取图像的模式。其返回值是包括上述模式的字符串。

from PIL importImage
im =Image.open('abs_path')
md = im.mode
print md #RGB

通过size属性可以获取图片的尺寸。这是一个二元组,包含水平和垂直方向上的像素数。

from PIL importImage
im =Image.open('abs_path')
im_size = im.size
print im_size

PIL使用笛卡尔(即x-y)像素坐标系统,坐标(0,0)位于左上角。注意:坐标值表示像素的角;位于坐标(0,0)处的像素的中心实际上位于(0.5,0.5)。坐标经常用二元组(x,y)表示。
长方形表示为四元组,前面是左上角坐标。例如,一个覆盖800x600的像素图像的长方形表示为(0,0,800,600)。

调色板模式 (“P”)使用一个颜色调色板为每个像素定义具体的颜色值

信息:使用info属性可以为一张图片添加一些辅助信息。这个是字典对象。加载和保存图像文件时,多少信息需要处理取决于文件格式。

from PIL import Image
im =Image.open('abs_path')
im.info
#{'jfif_version':(1, 1), 'jfif': 257, 'jfif_unit': 1, 'jfif_density': (96, 96), 'dpi': (96, 96)}
print im_info['jfif_version']

滤波器

对于将多个输入像素映射为一个输出像素的几何操作,PIL提供了4个不同的采样滤波器:
NEAREST:最近滤波。从输入图像中选取最近的像素作为输出像素。它忽略了所有其他的像素。
BILINEAR:双线性滤波。在输入图像的2x2矩阵上进行线性插值。注意:PIL的当前版本,做下采样时该滤波器使用了固定输入模板。
BICUBIC:双立方滤波。在输入图像的4x4矩阵上进行立方插值。注意:PIL的当前版本,做下采样时该滤波器使用了固定输入模板。
ANTIALIAS:平滑滤波。这是PIL 1.1.3版本中新的滤波器。对所有可以影响输出像素的输入像素进行高质量的重采样滤波,以计算输出像素值。在当前的PIL版本中,这个滤波器只用于改变尺寸和缩略图方法。
注意:在当前的PIL版本中,ANTIALIAS滤波器是下采样(例如,将一个大的图像转换为小图)时唯一正确的滤波器。BILIEAR和BICUBIC滤波器使用固定的输入模板,用于固定比例的几何变换和上采样是最好的。

Image模块中的方法resize()和thumbnail()都会resize图片,都可以用滤波器。
resize(size, filter=None)=> image

from PIL import Image
im= Image.open('abs_path')
im.size #(800, 450)
im_resize = im.resize((256,256))
im_resize.size #(256, 256)

#对参数filter不赋值的话,方法resize()默认使用NEAREST滤波器。如果要使用其他滤波器可以通过下面的方法来实现:
im_resize0 = im.resize((256,256), Image.BILINEAR)
im_resize1 = im.resize((256,256), Image.BICUBIC)
m_resize2 = im.resize((256,256), Image.ANTIALIAS)


im.thumbnail(size, filter=None)
#方法thumbnail()需要保持宽高比,对于size=(200,200)的输入参数,其最终的缩略图尺寸为(200, 112)。

from PIL import Image
im= Image.open('abs_path')
im.size #(800, 450)
im.thumbnail((200,200))
im.size#(200,112)

对参数filter不赋值的话,方法thumbnail()默认使用NEAREST滤波器。如果要使用其他滤波器可以通过下面的方法来实现:
im.thumbnail((200,200),Image.BILINEAR)
im.thumbnail((200,200), Image.BICUBIC)
im.thumbnail((200,200), Image.ANTIALIAS)

实现图像格式转换

不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。而对于灰度图像,不管其图像格式是PNG,还是BMP,或者JPG,打开后,其模式为“L”。

对于PNG、BMP和JPG彩色图像格式之间的互相转换都可以通过Image模块的open()和save()函数来完成。具体说就是,在打开这些图像时,PIL会将它们解码为三通道的“RGB”图像。用户可以基于这个“RGB”图像,对其进行处理。处理完毕,使用函数save(),可以将处理结果保存成PNG、BMP和JPG中任何格式。这样也就完成了几种格式之间的转换。同理,其他格式的彩色图像也可以通过这种方式完成转换。当然,对于不同格式的灰度图像,也可通过类似途径完成,只是PIL解码后是模式为“L”的图像。

Image模块的convert()函数:用于不同模式图像之间的转换。
Convert()函数有三种形式的定义,它们定义形式如下:
im.convert(mode) ⇒ image
im.convert(“P”, **options) ⇒ image
im.convert(mode, matrix) ⇒ image
使用不同的参数,将当前的图像转换为新的模式,并产生新的图像作为返回值。

OpenCV

Opencv 中 waitkey()& 0xFF,“0xFF”的作用解释

if cv2.waitkey(30)==27  v.s. if cv2.waitkey(30)&0xff==27
'''
cv2.waitkey(delay)函数
1.若参数delay≤0:表示一直等待按键;
2、若delay取正整数:表示等待按键的时间,比如cv2.waitKey(30),就是等待30(milliseconds);(视频中一帧数据显示(停留)的时间)
cv2.waitKey(delay)返回值:
1、等待期间有按键:返回按键的ASCII码(比如:Esc的ASCII码为27,即0001  1011);
2、等待期间没有按键:返回 -1;
'''
&0xff其实人如其名,就是和0xff进行and与运算,0xff的二进制是0b1111 1111 
当按下按键时,waitkey函数的输入值一定是一个正整数。任何一个正整数,与1111 1111&运算,其结果必然是他本身
其实,系统中按键对应的ASCII码值并不一定仅仅只有8位,同一按键对应的ASCII并不一定相同(但是后8位一定相同)。因为,系统为了区别不同情况下的同一按键。比如说“q”这个按键,当小键盘数字键“NumLock”激活时,“q”对应的ASCII值为100000000000001100011 。而其他情况下,对应的ASCII值为01100011。它们的后8位相同,其他按键也是如此。为了避免这种不同的情况,引用&0xff,正是为了只取按键对应的ASCII值后8位来排除不同按键的干扰进行判断按键是什么。

轮廓提取

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值