基于深色垂直中线用Python水平拆分双页报纸图像
嘿,刚好之前做过类似的报纸拆分需求,结合你已经完成的裁剪旋转步骤,给你两个靠谱的方案,直接就能用上:
定位垂直中线并拆分双页报纸的实现方案
方法1:直接用灰度列均值定位(简单高效,推荐优先试)
既然你的中线比周边区域更暗,那不用绕Canny,直接统计每列的亮度就能精准找到中线:
- 先把处理好的图像转成灰度图:
gray = cv2.cvtColor(your_processed_img, cv2.COLOR_BGR2GRAY) - 计算每一列的平均灰度值(值越小说明越暗):
col_avg_gray = np.mean(gray, axis=0) - 找到灰度均值最小的列索引,这就是中线的位置:
mid_col = np.argmin(col_avg_gray) - 直接拆分左右页:
left_page = your_processed_img[:, :mid_col] right_page = your_processed_img[:, mid_col:]
方法2:结合Canny边缘检测定位(适配边缘明显的中线)
如果想用上你已经得到的Canny边缘结果,核心是过滤出垂直边缘并找到最密集的位置:
- 增强垂直边缘信号
先用垂直结构元素做膨胀,把零散的垂直边缘连成完整的线条:# 创建垂直方向的结构元素(高度可以根据图像大小调整,比如20) vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 20)) # 膨胀操作强化垂直边缘 vertical_edges = cv2.morphologyEx(your_canny_edges, cv2.MORPH_DILATE, vertical_kernel) - 统计边缘列的密度
计算每一列的白色边缘像素数量,最多的列就是中线位置:col_edge_count = np.sum(vertical_edges, axis=0) mid_col = np.argmax(col_edge_count) - 拆分图像
和方法1一样,用得到的mid_col直接分割即可。
额外优化Tips
- 如果图像还有轻微的噪点或小倾斜,可以对列均值/边缘计数做平滑处理,比如用滑动平均:
# 用窗口大小为15的滑动平均平滑列均值 smoothed_col_avg = np.convolve(col_avg_gray, np.ones(15)/15, mode='same') mid_col = np.argmin(smoothed_col_avg) - 如果中线不是绝对笔直,可以取边缘计数最高的前10个列的中位数作为拆分点,这样结果更鲁棒。
内容的提问来源于stack exchange,提问作者ghukill
相关产品推荐
相关产品推荐

