分割图像并指定多个灰度阀值,对同一幅图像进行分区域的二值化

 大致原理介绍:

        图像处理过程中经常需要用到二值化图像并提取关键点的处理方式,但是如果只指定一个灰度阀值,得到的处理结果往往不能让人满意,亮度相对较高,阀值相对较低的地方会出现大片的“白斑”,。因此就需要将图像分割为多个小块,然后指定一个最小亮度阀值 lignmin 和一个最大亮度阀值 lightmax,之后通过计算为每个图像小块线性匹配出一个合适的阀值,从而得到较为理想的效果。

        如下图,Y轴 lightmin 和 lightmax 分别是指定的灰度阀值下界和上界,X轴是分割后小依据平均灰度从小到大排列的图像小块

数据结构:

        加载位图使用OPENGL 的GLAUX 中的 auxDIBImageLoad(fielpath) 函数,然后初始图像数据保存在一个 AUX_RGBImageRec (GLAUX提供的数据结构,注意:图像从左下角开始扫描的)类型数据结构中。需要用到的自定义结构有 struct imgMap,保存图像分割数据和一个存储 imgArea * 的指针链表,用来存储分割后的图像小块 。struct imgArea  是存储每个分割小块的数据结构,包含了小块 平均亮度,大小, 原图像中的位置和指向下一个小块的的指针 等数据。

typedef struct _imgArea
{
	unsigned char avevalue; // 平均亮度
	unsigned char selvalue; // 选择的亮度阀值
	// 宽度和高度以像素为单位
	int width;
	int height;
	// 如果 imgArea 所属的 imgMap->islefetbottom=TRUE,则存储
	// 的是imgArea左下角第一个像素在 imgMap->pimg->data 中对
	// 应像素的指针;否则就是左上角第一个像素在 imgMap->pimg
	// ->data 中对应的指针
	unsigned char *begin; 
	// 每行像素占用的字节数(虚拟),可以方便遍历 imgArea 中的
	// 像素,( begin + n*step )可以方便的指向第 N 行的首个像
	// 素的地址。
	// 注意:虚拟 的含义是说 step != imgArea->width * sizeof(unsigned char) * 3
	//			实际上 step = imgMap->pimg->sizeX * sizeof(unsigned char) * 3
	int step;
	struct _imgArea 
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现Python车牌识别图像分割,可以按照以下步骤进行操作: 1. 载入图像并将其转换为灰度图像。 ```python import cv2 # 载入图像并将其转换为灰度图像 img = cv2.imread('car_plate.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ``` 2. 对灰度图像进行二值化处理。 ```python # 对灰度图像进行二值化处理 ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) ``` 3. 对二值化图像进行形态学操作,消除噪声,得到更加清晰的车牌区域。 ```python # 定义结构元素 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) # 对二值化图像进行形态学操作 morphed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=2) ``` 4. 查找车牌区域的轮廓,筛选出符合条件的轮廓。 ```python # 查找轮廓 contours, hierarchy = cv2.findContours(morphed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 筛选符合条件的轮廓 rects = [] for cnt in contours: area = cv2.contourArea(cnt) if area < 2000 or area > 20000: continue rect = cv2.boundingRect(cnt) x, y, w, h = rect if w > h: continue rects.append(rect) ``` 5. 对车牌区域进行排序,得到车牌上每个字符的位置。 ```python # 对车牌区域进行排序 rects = sorted(rects, key=lambda x: x[0]) # 得到车牌上每个字符的位置 characters = [] for rect in rects: x, y, w, h = rect char_img = morphed[y:y+h, x:x+w] characters.append(char_img) ``` 6. 将每个字符图像保存到文件中,用于后续的字符识别。 ```python # 将每个字符图像保存到文件中 for i, char_img in enumerate(characters): filename = 'char_{}.jpg'.format(i) cv2.imwrite(filename, char_img) ``` 以上就是Python车牌识别图像分割的完整流程,其中需要注意的是,在步骤4中,需要根据实际情况调整筛选条件,以确保得到最准确的车牌区域

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值