如何从图像提取黑白文本并将度分秒地理坐标转换为十进制度坐标?
图像地理坐标提取与度分秒转十进制度解决方案
一、优化图像预处理,提升OCR准确率
你的方法一已取得初步效果,可通过以下优化进一步降低OCR干扰:
改进后的预处理代码
import cv2 import pytesseract as pt # 读取图像并转为灰度图(消除彩色通道干扰) img = cv2.imread('image.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 背景减法:中值模糊生成背景图,核大小根据文本尺寸调整(建议奇数) bg = cv2.medianBlur(gray, 71) out = 255 - cv2.absdiff(bg, gray) # 二值化增强文本与背景对比度 _, thresh = cv2.threshold(out, 200, 255, cv2.THRESH_BINARY) # 形态学闭运算去除噪声点,填补文本缝隙 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) cleaned_img = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel) # 放大图像提升小文本识别精度 cleaned_img = cv2.resize(cleaned_img, None, fx=1.2, fy=1.2, interpolation=cv2.INTER_CUBIC) # OCR配置:指定字符白名单+文本块模式,过滤无关字符 custom_config = r'--oem 3 --psm 6 -c tessedit_char_whitelist=0123456789°\'\"NSEW ' ocr_result = pt.image_to_string(cleaned_img, config=custom_config).strip() print("优化后OCR结果:", ocr_result)
关键优化点
- 转灰度图:聚焦文本本身,消除彩色通道的干扰
- 调整中值模糊核:更大的核可更好过滤文本细节,保留均匀背景
- 形态学操作:闭运算去除孤立噪声,填补文本缝隙
- OCR字符白名单:只保留坐标相关的数字、符号和方向字符,避免无关识别结果
- 图像放大:提升小尺寸文本的识别精度
二、度分秒转十进制度坐标实现
针对OCR可能出现的符号识别错误(比如把分号'识别为度号°),用正则匹配提取有效信息后再转换:
转换代码
import re def dms_to_decimal(dms_text): # 匹配度分秒模式,兼容符号识别错误(如把'识别为°) pattern = r'(\d+)°\s*(\d+)[\'°]\s*(\d+\.?\d*)["\'"]\s*([NSEW])' match = re.search(pattern, dms_text) if not match: return None degrees = int(match.group(1)) minutes = int(match.group(2)) seconds = float(match.group(3)) direction = match.group(4).upper() # 计算十进制度 decimal = degrees + minutes / 60 + seconds / 3600 # 南纬/西经取负数 if direction in ['S', 'W']: decimal = -decimal return decimal # 示例:处理你的OCR结果 "TNS 4° 39°96.2\" N" decimal_coord = dms_to_decimal("TNS 4° 39°96.2\" N") if decimal_coord: print("十进制度坐标:", round(decimal_coord, 6))
说明
- 正则兼容符号错误:即使OCR把分号识别为度号,也能正确提取度、分、秒数值
- 方向判断:自动处理南北纬、东西经的正负转换
- 精度控制:用
round保留6位小数,符合地理坐标常规精度
内容的提问来源于stack exchange,提问作者David Andres Rubiano Venegas
相关产品推荐
相关产品推荐

