灰度即R=G=B 二值化只取255 0
对图片进行灰度化处理,目的是 1 减少数据量 (减少不明显) 2 为二值化准备
对数据进行灰度发现数据量减少并不明显 尤其是 最大 和 平均 灰度法 权重法数据量减少明显 但是权重不容易处理(权重需要自己去调整到自己想要的)
def gray_cv(img):
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 图片灰度化,使用BGR转换灰度。效果稍微好点
plt.imshow(img2)
plt.show()
cv2.imwrite("gray_cv", img2)
img3 = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) # RGB转换为灰度
plt.imshow(img3)
plt.show()
def gray_max(img):
gray_max_rgb_image = img.copy() # 复制图像,用于后面保存灰度化后的图像bgr值矩阵
img_shape = img.shape # 返回一位数组(高,宽,3)获得原始图像的长宽以及颜色通道数,一般彩色的颜色通道为3,黑白为1
for i in range(img_shape[0]): # 按行读取图片的像素bgr
for j in range(img_shape[1]): # 对每一行按照列进行每一个像素格子进行读取
gray_max_rgb_image[i, j] = max(img[i, j][0], img[i, j][1], img[i, j][2]) # 求max灰度值
print(gray_max_rgb_image)
cv2.imwrite("gray_max1.jpg", gray_max_rgb_image) # 保存图片
plt.imshow(gray_max_rgb_image)
plt.show()
def gray_avg(img):
gray_avg_rgb_image = img.copy() # 复制图像,用于后面保存灰度化后的图像bgr值矩阵
img_shape = img.shape # 返回一位数组(高,宽,3)获得原始图像的长宽以及颜色通道数,一般彩色的颜色通道为3,黑白为1
for i in range(img_shape[0]): # 按行读取图片的像素bgr
for j in range(img_shape[1]): # 对每一行按照列进行每一个像素格子进行读取
gray_avg_rgb_image[i, j] = (int(img[i,j][0])+int(img[i,j][1])+int(img[i,j][2]))/3 # 求平均灰度值
print(gray_avg_rgb_image)
cv2.imwrite("gray_avg1.jpg", gray_avg_rgb_image)
plt.imshow(gray_avg_rgb_image)
plt.show()
def gray_weight(img): # 参数没有调好,不好调,图像大小减小多
# wr, wg, wb = 0.11, 0.59, 0.11
wr, wg, wb = 0.299, 0.587, 0.114
gray_weightmean_rgb_image = img.copy() # 复制图像,用于后面保存灰度化后的图像bgr值矩阵
img_shape = img.shape # 返回一位数组(高,宽,3)获得原始图像的长宽以及颜色通道数,一般彩色的颜色通道为3,黑白为1
for i in range(img_shape[0]): # 按行读取图片的像素bgr
for j in range(img_shape[1]): # 对每一行按照列进行每一个像素格子进行读取
gray_weightmean_rgb_image[i, j] = (int(wr*img[i,j][2])+int(wg*img[i,j][1])+int(wb*img[i,j][0])) / 3 # 求设置RBG不同权重灰度值
print(gray_weightmean_rgb_image)
cv2.imwrite("gray_weight1.jpg", gray_weightmean_rgb_image)
plt.imshow(gray_weightmean_rgb_image)
plt.show()
1 图片获取过程中:由于受传感器材料属性、工作环境、电子元器件和电路结构等影响,会引入各种噪声,如电阻引
起的热噪声、场效应管的沟道热噪声、光子噪声、暗电流噪声、光响应非均匀性噪声。
2 信号传输过程中:由于传输介质和记录设备等的不完善,数字图像在其传输记录过程中往往会受到多种噪声的污染。另外,在图像处理的某些环节当输入的对象并不如预想时也会在结果图像中引入噪声。
def bi_fillter(img):
time1 = time.time()
dst1 = cv2.bilateralFilter(src=gray_img, d=0, sigmaColor=15, sigmaSpace=20)
cv2.imwrite("bi_img.jpg", dst1) # 图片大小100*50 效果更好。
plt.imshow(dst1)
plt.show()
time2 = time.time()
print("gray_bi",time2-time1)
return dst1
全零 是黑色 全255 白色,自己设置一个阀门,把大于阀门数的设为255,否则为0
def erzhihua(img):
gray_max_rgb_image = bi_img.copy() # 复制图像,用于后面保存灰度化后的图像bgr值矩阵
bi_img_shape = bi_img.shape # 返回一位数组(高,宽,3)获得原始图像的长宽以及颜色通道数,一般彩色的颜色通道为3,黑白为1
for i in range(bi_img_shape[0]): # 按行读取图片的像素bgr
for j in range(bi_img_shape[1]): # 对每一行按照列进行每一个像素格子进行读取
rgb_max = max(bi_img[i, j][0], bi_img[i, j][1], bi_img[i, j][2]) # 求最大灰度化的基础进行二值化
if rgb_max > 76: # 可以通过调试,查看变量方法,设置阀值
gray_max_rgb_image[i, j] = 255
else:
gray_max_rgb_image[i, j] = 0
plt.imshow(gray_max_rgb_image)
return gray_max_rgb_image
字符分隔的三种方法:基于边缘轮廓的字符分隔(常用) 基于投影阀值的字符分隔 基于神经网络聚类的字符分隔
(1)垂直投影分割法:把二值图像在垂直以及水平方向上进行投影,从而形成了二值统计图像,从而确定字符位置。使用此方法不仅程序设计要求较为简单,而且分割速度快。但是分割方法过于固定,区域多为方形。
(2)聚类分析分割法:把字符通过形态学方式构成连通域,再与已知特征相结合完成字符分割。使用此种方法能够在汉字字符不连通的情况下也能完成分割任务,但是这种方法不仅计算复杂,且效率不高。
(3)轮廓提取分割法:首先需要对二值图像进行边缘检测计算,然后根据字符的边界将字符框选并分割出来,使用此种方法分割出来的字符边缘非常准确,但是与聚类分析的分割方法相似,具有计算量大,计算速度慢的缺点。
垂直投影法:对应车牌变形的效果不太好,而且图片质量越高,投影效果越好
def touyin2(img):
paintx = np.zeros(img.shape)
h, w = img.shape[0], img.shape[1]
a = [0 for i in range(w)]
for j in range(0, w): # 遍历一行
for i in range(0, h): # 遍历列
if img[i, j][0] == 0: # 如果改点为黑点
a[j] += 1 # 该列的计数器加一计数 相对于计算某列的白像素
for j in range(0, w): # 遍历每一列
for i in range(a[j]): # 从该列应该变黑的最顶部的点开始向最底部涂黑
paintx[i, j] = 255 # 涂黑
plt.imshow(paintx)
plt.show()