You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于深色垂直中线用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边缘结果,核心是过滤出垂直边缘并找到最密集的位置:

  1. 增强垂直边缘信号
    先用垂直结构元素做膨胀,把零散的垂直边缘连成完整的线条:
    # 创建垂直方向的结构元素(高度可以根据图像大小调整,比如20)
    vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 20))
    # 膨胀操作强化垂直边缘
    vertical_edges = cv2.morphologyEx(your_canny_edges, cv2.MORPH_DILATE, vertical_kernel)
    
  2. 统计边缘列的密度
    计算每一列的白色边缘像素数量,最多的列就是中线位置:
    col_edge_count = np.sum(vertical_edges, axis=0)
    mid_col = np.argmax(col_edge_count)
    
  3. 拆分图像
    和方法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:09:15