赞
踩
我们为啥要进行灰度化,那是彩色图像不利于进行图像识别,而灰度图像不仅仅压缩了图像,其只有一个数据矩阵方便机器进行数据分析。
我们都知道RGB由三色组成,red,green,blue,这三种颜色组成了其他一切颜色。而灰度图像色素为RGB(r,r,r),其中r的取值为0~256,即灰度值共256个级别。
而我们灰度化处理的方法主要是三种:
(1)最大值法,就是让RGB中的值等于三个r值得最大的那个
(2)平均值法,让RGB得值等于三个r和得平均值
(3)加权平均法,根据重要性给三个组成颜色分配不同的权值,并且让三个r等于他们值得加权平均值,这里写一下计算过程:
R
=
G
=
B
=
(
W
r
R
+
W
g
G
+
W
b
B
)
/
3
R=G=B=(W_rR+W_gG+W_bB)/3
R=G=B=(WrR+WgG+WbB)/3
经过简单的搜索我们知道,人眼对三种色彩的敏感度G>R>B,当
W
r
=
0.299
,
W
g
=
0.587
,
W
b
=
0.114
W_r=0.299,W_g=0.587,W_b=0.114
Wr=0.299,Wg=0.587,Wb=0.114时可以得到最合理的灰度图像
灰
度
值
T
T
=
0.299
R
+
0.587
G
+
0.114
B
灰度值TT=0.299R+0.587G+0.114B
灰度值TT=0.299R+0.587G+0.114B
我们为什么要花直方图?这应该是你脑子中蹦出来的第一个疑问。
直方图时关于数字图像的数据,即数字图像中每一个灰度与其出现频度之间的统计关系,我们可以从图像上得到很多信息:
然后我们把原来灰度图像的数据直方图进行均衡化,均衡化是改变图像的直方图分布,让图像展现的数据分布均衡一点,不那么集中。
这样可以增加像素灰度值的动态范围,增强图像整体对比度的效果。
使用过p图的同学一定会知道,调整图像的对比度能够改变图像的亮度,在这里我们让图像整体更加清晰一些,从而减少图片中部分地方过明或过暗的情况。
最后简要描述一下算法的实现思路:
记得补充代码
一幅原始图像在获取和传输的过程中会受到各种噪声的干扰,这些干扰使图像的质量下降。
我们要认识常见的噪声然后对症下药,典型的噪声有:
在认识去噪方法之前,我们需要知道几个滤波原理才能明白去噪方法是怎么执行的
通过部分区域的像素点集合计算出他们像素的均值,然后把均值赋值给当前的像素点,并作为处理后图像在该点的灰度值。这种方法称为均值滤波又称线性滤波,主要方法如前面所说为领域平均法。
g
(
x
,
y
)
=
1
M
∑
∫
f
(
x
,
y
)
g(x,y)=\frac{1}{M}\sum\int f(x,y)
g(x,y)=M1∑∫f(x,y)
其中,M为模板中包含当前像素点在内的像素总个数,s为选取的模板的点的集合
利用某一个像素的点的附近领域的点的灰度值的中值代替这个像素点的灰度值,很明显这种方法可以去掉某些突出的像素点,它被称为中值滤波。这种方法使图像更加平滑,所以也可以视为一种局部平滑技术。中值滤波在一定的条件下可以克服另一种方法即线性滤波的缺点(细节处理不好),对于滤除脉冲干扰(图像扫描噪点)是最有效的。中值滤波器处理连续图像窗函数时与线性滤波器工作方式相似,但是他不是加权运算。
取3x3函数窗计算(i,j)为中心函数窗像素中值过程:
经过中值滤波处理的图像,对于过亮和过暗的图像能够更好的区分背景和字符。
对于方法的选择:最简单的方法肯定是线性滤波技术,拥有理论基础和易于实现等特征,大家都喜欢使用它。
进行图像滤波去噪,是为了改善图像质量并有利于提取图像的有效信息。
基于噪声频谱分布的规律和统计特征,图像的特点。常见的图像去噪方法有:
高斯函数的重要性质(个人理解)
图像边缘:图像局部特性的不连续性
* 灰度级突变
* 颜色突变
* 纹理结构突变
图像的不连续性:
几个会接触到的术语:
处理差分域时,可用图像的一阶差分直接代替图像函数的导数
f
(
x
+
1
,
y
)
−
f
(
x
,
y
)
f(x+1,y) - f(x,y)
f(x+1,y)−f(x,y)
y方向上的一阶差分:
f
(
x
,
y
+
1
)
−
f
(
x
,
y
)
f(x,y+1) - f(x,y)
f(x,y+1)−f(x,y)
总结原理:基于边缘地带的灰度迅速变换,此时一阶导数达到最大的原理,利用导数算子检测边缘。很少用
利用局部差分算子寻找边缘的算子,计算对角导数:
t = f[i,j] - f[i+1,j+1]
d = f[i+1,j] - f[i,j+1]
G[i,j] = sqrt(t2+d2)
最终的近似值=abs(t)+abs(d)
Sobel算子很容易在空间上实现,边缘检测器不但产生了较好的边缘检测效果的同时
由于sobel算子引入了局部平均,使得受到的噪声的影响比较小,使用大的领域的时候,抗噪声会更好,只是会增加计算量同时得到的边缘会更粗
方式:利用像素点上下、左右领域点的灰度加权算法,根据在边缘点处达到极值这一现象进行边缘检测
sobel算子对噪声具有平滑作用,提出了较为精确地边缘方向信息
同时由于局部平均的算法,同时它会检测出许多伪边缘,且边缘定位精度不够高
当对精度要求不是很高的时候就常用这种方式来检测边缘
以上,车牌识别的1/3工作已经完毕,主要包括了:
在后面,我们会继续提到图像裁剪、图像内容识别等内容!
import cv2
img1 = cv2.imread("test.jpg")
cv2.namedWindow("Image")
cv2.imshow("Image",img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
img = cv2.imread("test.jpg",1)
img1 = cv2.imread("test.jpg",0)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow("img",img)
cv2.imshow("gray1",img1)
cv2.imshow("gray2",gray)
cv2.waitKey(0)
import cv2 # 读入原始图像 img = cv2.imread("test.jpg",1) img1 = gray.copy() # 灰度化处理:用于图像二值化 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 二值化函数 cv2.threshold(gray,140,255,0,gray) # 通过窗口展示图片,第一个参数为窗口名,第二个为读取的图盘变量 cv2.imshow('img',img) cv2.imshow('gray',img1) cv2.imshow('Binarization',gray) # 暂停显示 cv2.waitKey(0)
import cv2 import copy # 读入原始图像 img = cv2.imread('test.jpg',1) # 灰度化处理 img1 = cv2.imread('test.jpg',0) # 灰度化处理:用于图像的二值化 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 伽马变化 gamma = copy.deepcopy(gray) rows = img.shape[0] cols = img.shape[1] for i in range(rows): for j in range(cols): gamma[i][j] = 3*pow(gamma[i][j],0.8) # 展示图片 cv2.imshow('img',img) cv2.imshow('gray',img1) cv2.imshow('gamma',gamma) # 展示窗口 cv2.waitKey(0)
import cv2 import copy import math # 读入图像 img = cv2.imread("test.jpg",1) # 灰度化处理 img1 = cv2.imread('test.jpg',0) # 灰度化处理:这种灰度化处理用于图像二值化 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 对数变换 logc = copy.deepcopy(gray) rows = img.shape[0] cols = img.shape[1] for i in range(rows): for j in range(cols): logc[i][j] = 3 * math.log(1 + logc[i][j]) cv2.imshow('img',img) cv2.imshow('gray',img1) cv2.imshow('logc',logc) # 展示图片 cv2.waitKey(0)
import cv2 import copy import math # 读入原始图像 img = cv2.imread('test.jpg',1) # 灰度化处理 img1 = cv2.imread("test.jpg",0) # 灰度化处理:次灰度化处理用于图像二值化 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 反色变换 cover = copy.deepcopy(gray) rows = img.shape[0] cols = img.shape[1] for i in range(rows): for j in range(cols): cover[i][j] = 255 - cover[i][j] # 展示图像 cv2.imshow('img',img) cv2.imshow('gray',gray) cv2.imshow('cover',cover) # 展示图片 cv2.waitKey(0)
import numpy as np import cv2 import matplotlib.pyplot as plt img = cv2.imread('test.jpg',1) # 均值滤波 img_mean = cv2.blur(img,(5,5)) # 高斯滤波 img_Guassian = cv2.GaussianBlur(img,(5,5),0) # 中值滤波 img_median = cv2.medianBlur(img,5) # 双边滤波 img_bilater = cv2.bilateralFilter(img,9,75,75) # 展示图片 cv2.imshow('test',img) cv2.imshow('mean',img_mean) cv2.imshow('Guassian',img_Guassian) cv2.imshow('median',img_median) cv2.imshow('bilater',img_bilater) # 展示图像 cv2.waitKey(0) # blog.csdn.net/qq_27261889/article/80822270
import cv2 from skimage import data,filters,img_as_ubyte img = cv2.imread('test.jpg',1) # 最后两个参数的含义: # 用来选择方向 # 1,1 全方位| 1,0 水平方向| 0,1 竖直方向 edges = cv2.Sobel(img,cv2.CV_16S,1,1) # 不需要进行灰度处理就可以唉 # 转化类型 img_edges = cv2.convertScaleAbs(edges) cv2.imshow('test',img) cv2.imshow('edge',img_edges) cv2.waitKey(0)
img = cv2.imread('test.jpg',0) # img = data.camera() # 系统自带灰度图像 print(type(img)) # 边缘检测必须要是灰度图像 # .sobel 全方位 # .sobel_h 水平方向 # .sobel_v 竖直方向 edges = filters.sobel(img) # 浮点型转换成伟整型 edges = img_as_ubyte(edges) cv2.imshow('test',img) cv2.imshow('edge',edges) cv2.waitKey(0)
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。