Python 图片处理笔记

这篇具有很好参考价值的文章主要介绍了Python 图片处理笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

import numpy as np
import cv2
import os
import matplotlib.pyplot as plt


# 去除黑边框
def remove_the_blackborder(image):
    image = cv2.imread(image)      #读取图片
    img = cv2.medianBlur(image, 5) #中值滤波,去除黑色边际中可能含有的噪声干扰
    #medianBlur( InputArray src, OutputArray dst, int ksize );
    #这里的src代表输入图像,dst代表输出图像,ksize 必须是正数且为奇数
    #该函数使用中值滤波器来平滑图像,可以消除图像中的小点,该值越大,则消除的点越大
    b = cv2.threshold(img, 3, 255, cv2.THRESH_BINARY) #调整裁剪效果
    #大于3 的像素点都处理成第三个参数值,小于3的像素点都处理成0
    #大于3的像素点,都替换成纯白色(RGB==255)
    binary_image = b[1]            #二值图--具有三通道
    #彩色图像: 有blue,green,red三个通道,取值范围均为0-255
    #灰度图:只有一个通道0-255,所以一共有256种颜色
    #二值图像:只有两种颜色,黑色和白色,二值化就是把图像的像素转变为0或者255,只有这两个像素值。0白色 1黑色 。0是黑色,255是白色
    binary_image = cv2.cvtColor(binary_image,cv2.COLOR_BGR2GRAY)
    #彩色图像,进行RGB到灰度的转换
    # print(binary_image.shape)     #改为单通道
 
    edges_y, edges_x = np.where(binary_image==255) ##h, w
    #选取白色(RGB ==255)点的坐标
    #白色(RGB ==255)点的边界就是我们要保留的图片
    bottom = min(edges_y)             
    top = max(edges_y) 
    height = top - bottom            
                                   
    left = min(edges_x)           
    right = max(edges_x)             
    height = top - bottom 
    width = right - left

    #微调
    # 实际操作过程中发现,去掉边框的图像,仍然有几个像素数宽度的黑框,这里手动去掉
    boder = 3
    bottom = bottom + boder
    height = height - (boder * 2)
    left = left + boder
    width = width - (boder * 2)

    res_image = image[bottom:bottom+height, left:left+width]

    return res_image  

cv2.medianBlur

 img = cv2.medianBlur(image, 5) #中值滤波,去除黑色边际中可能含有的噪声干扰

#medianBlur( InputArray src, OutputArray dst, int ksize );
#这里的src代表输入图像,dst代表输出图像,ksize 必须是正数且为奇数
#该函数使用中值滤波器来平滑图像,可以消除图像中的小点,该值越大,则消除的点越大

cv2.threshold

b = cv2.threshold(img, 3, 255, cv2.THRESH_BINARY) #调整裁剪效果

#大于3 的像素点都处理成第三个参数值,小于3的像素点都处理成0

#大于3的像素点,都替换成纯白色(RGB==255)

https://zhuanlan.zhihu.com/p/511579219?utm_id=0


    binary_image = b[1]            #二值图--具有三通道

cv2.cvtColor


    binary_image = cv2.cvtColor(binary_image,cv2.COLOR_BGR2GRAY)

#彩色图像,进行RGB到灰度的转换    # print(binary_image.shape)     #改为单通道

OtherS

print(list(set(edges_y)))  对原列表去重并按从小到大排序

np.argmax(np.bincount(edges_x)) 

Counter(edges_x).most_common(20) 找出出现次数最多的几个元素

分割清楚脏背景

import cv2
import numpy as np
from skimage.filters import unsharp_mask
from skimage.filters import gaussian
from skimage.restoration import denoise_tv_chambolle
import matplotlib.pyplot as plt
from collections import Counter


#分割图片,提取每一个 方格字 其他的部分,设置成白色RGB==255
def clean_Zang_background_by_Fengge(image):
    image = cv2.imread(image)      #读取图片
    img = cv2.medianBlur(image, 5) #中值滤波,去除黑色边际中可能含有的噪声干扰
    #medianBlur( InputArray src, OutputArray dst, int ksize );
    #这里的src代表输入图像,dst代表输出图像,ksize 必须是正数且为奇数
    #该函数使用中值滤波器来平滑图像,可以消除图像中的小点,该值越大,则消除的点越大
    b = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) #调整裁剪效果
    #大于190 的像素点都处理成 255 白色
    #计算
    binary_image = b[1]            #二值图--具有三通道
    #彩色图像: 有blue,green,red三个通道,取值范围均为0-255
    #灰度图:只有一个通道0-255,所以一共有256种颜色
    #二值图像:只有两种颜色,黑色和白色,二值化就是把图像的像素转变为0或者255,只有这两个像素值。0白色 1黑色 。0是黑色,255是白色
    binary_image = cv2.cvtColor(binary_image,cv2.COLOR_BGR2GRAY)
    #彩色图像,进行RGB到灰度的转换

    edges_y, edges_x = np.where(binary_image < 127) ##h, w
    #选取有颜色(RGB < 127)点的坐标
    #直方图统计
#    plt.hist(edges_x,bins=1000)
#    plt.savefig("./3_edges_x.png")
#    plt.hist(edges_y,bins=1000)
#    plt.savefig("./3_edges_y.png")

    # Step 1 :使用X轴 先将图片 纵向分割成一条一条
    xdict = Counter(edges_x) 
    #统计edges_x中各个元素的个数-可以反映出 图片像素点在X轴压缩后的分布情况
    x_black = sorted(xdict.keys())
    #排序
    #x_black中的元素,表示对应的y轴这列像素点存在黑色(RGB),反之不存在与black中的X轴对应的一列像素点是纯白色
    tmp=0
    lnum = 0
    n = 10
    for a in x_black:
        lnum = lnum + 1
        if tmp == a:
            tmp = tmp + 1
        else:
            #tmp 到 a之间的区域 是没有数据的,可以清除了
            # 由于上面的 127的选取会剪掉多余可用的部分,因此出需要在可用的数据部分基础上多保留 n个像素点,以确保可用部分不丢失

            # debug 显示框框,
            # image[0:, (tmp+n):(tmp+1+n), :] = (0, 0, 0) #debug
            # image[0:, (a-1-n):(a-n), :] = (0, 0, 0) #debug

            #清理 分割出来的脏背景
            image[0:, (tmp+n):(a-n), :] = (255, 255, 255)
            tmp = a + 1

    # 最后一条脏区域
    image[0:, (tmp+n):, :] = (255, 255, 255)
    # 兼容第一条脏区域
    image[0:, 0:n, :] = (255, 255, 255)


    # Step 2  : 使用Y轴 先将图片 横向分割 清理上下两个区域
    #取出最大,最小值即可
    ymin = min(edges_y)             
    ymax = max(edges_y)
    yn = 7
    image[(ymax+yn):(ymax+1+yn), 0:, :] = (0, 0, 0) #debug
    image[(ymin-1-yn):(ymin-yn), 0:, :] = (0, 0, 0) #debug
    #清理 分割出来的脏背景
    image[(ymax+yn):, 0:, :] = (255, 255, 255) 
    image[0:(ymin-yn), 0:, :] = (255, 255, 255)

    return image

cv2.imwrite("./3_fenge.jpg",remove_the_blackborder("3_biankuang.jpg"))

原始图像

Python 图片处理笔记,python,笔记,opencv

纵向清理

Python 图片处理笔记,python,笔记,opencv

纵向+横向清理

Python 图片处理笔记,python,笔记,opencv

上述算法在使用过程中,依然有bug,

  • 如果有大块的墨点,影响判断,
  • 图像的字迹太淡,会导致图片被清零

Python 图片处理笔记,python,笔记,opencvPython 图片处理笔记,python,笔记,opencv

下一步优化算法:

1. 计算 一列 或者一行的 RGB avg然后,根据数据统计可以分析出边框,但是对于 图像这种差异不明显的图片,无法分离出;这样方法之实用与文字这种差异比较明显的场景

import numpy as np
import matplotlib.pyplot as plt
import cv2

#分割图片,提取每一个 方格字 其他的部分,设置成白色RGB==255
def clean_Zang_background_by_Fengge(image):
    image = cv2.imread(image)      #读取图片
    img = cv2.medianBlur(image, 5) #中值滤波,去除黑色边际中可能含有的噪声干扰
    #medianBlur( InputArray src, OutputArray dst, int ksize );
    #这里的src代表输入图像,dst代表输出图像,ksize 必须是正数且为奇数
    #该函数使用中值滤波器来平滑图像,可以消除图像中的小点,该值越大,则消除的点越大
    b = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) #调整裁剪效果
        #大于127 的像素点都处理成 255 白色
    #计算
    binary_image = b[1]            #二值图--具有三通道
    #彩色图像: 有blue,green,red三个通道,取值范围均为0-255
    #灰度图:只有一个通道0-255,所以一共有256种颜色
    #二值图像:只有两种颜色,黑色和白色,二值化就是把图像的像素转变为0或者255,只有这
两个像素值。0白色 1黑色 。0是黑色,255是白色
    binary_image = cv2.cvtColor(binary_image,cv2.COLOR_BGR2GRAY)
    #彩色图像,进行RGB到灰度的转换
    # debug
    cv2.imwrite('3_xheibai.jpg',binary_image)

    #edges_y, edges_x = np.where(binary_image < 127) ##h, w
    #选取有颜色(RGB < 127)点的坐标
    # debug
    print(len(binary_image))
    print(binary_image)
    #xavgRGB = {}
    xNum=0
    xavyRGB=[]
    for ils in binary_image:
        xNum = xNum+1
        mavg =255 - np.mean(ils)   #取反
        # 去除边框
                if(mavg > 250):
            mavg=0
        xavyRGB.append(mavg)
        # debug
        plt.bar(xNum, mavg)
    print(xNum)
    plt.savefig("./3_xavyRGB.png")


clean_Zang_background_by_Fengge("0004_page_0004.jpg")

原始图片和 y轴压缩后的avg柱状图

Python 图片处理笔记,python,笔记,opencvPython 图片处理笔记,python,笔记,opencv

考虑其他方法。文章来源地址https://www.toymoban.com/news/detail-732560.html

验证使用的图片

Python 图片处理笔记,python,笔记,opencvPython 图片处理笔记,python,笔记,opencvPython 图片处理笔记,python,笔记,opencv

到了这里,关于Python 图片处理笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机视觉—python 】 图像处理入门教程 —— 图像属性、像素编辑、创建与复制、裁剪与拼接【 openCV 学习笔记 005 to 010 and 255】

    OpenCV中读取图像文件后的数据结构符合Numpy的ndarray多维数组结构,因此 ndarray 数组的属性和操作方法可用于图像处理的一些操作。数据结构如下图所示: img.ndim:查看代表图像的维度。彩色图像的维数为3,灰度图像的维度为2。 img.shape:查看图像的形状,代表矩阵的行数(高

    2024年01月19日
    浏览(70)
  • python opencv比较图片相似度

    目录 一:均值哈希算法 二:三直方图算法 三:单通道直方图 一:均值哈希算法 均值哈希算法是一种快速比较图像相似度的方法。它首先将图像转化为灰度图像,然后计算图像的均值,接着将每个像素的

    2024年02月22日
    浏览(37)
  • python图片处理之图片切割

    python图片切割在很多项目中都会用到,比如验证码的识别、目标检测、定点切割等,本文给大家带来python的两种切割方式: 输入图片: 第一种方法切割效果: 第二种方法切割效果:

    2024年02月14日
    浏览(34)
  • python 用OpenCV 将图片转视频

     我们无法打开output3.mp4。这可能是因为文件类型不受支 持、文件扩展名不正确或文件已损坏,0xC00D36C4 如果生成的视频报这个错,一般是视频的分辨率 设置的不匹配

    2024年01月17日
    浏览(36)
  • Python 结合opencv实现图片截取和拼接

    python 3.6.2 scikit-build-0.16.7 win10 opencv_python-4.5.4.60-cp36-cp36m-win_amd64.whl 下载地址: https://pypi.org/project/opencv-python/4.5.4.60/#files https://files.pythonhosted.org/packages/57/6c/7f4f56b2555d5c25dd4f41fc72a16dc6402cb2b4f967da11d8d26c669b55/opencv_python-4.5.4.60-cp36-cp36m-win_amd64.whl 注意:下载时不用下abi版的,比如 o

    2024年02月08日
    浏览(45)
  • Python Opencv 图片识别表格:边框线检测

    Python数据开发工作需求对图片做边框线检查和图片中的直线,非常实用建议收藏 下面需要用模块,先安装一下: 该示例代码使用边缘检测和霍夫变换提取图片中的直线,然后根据直线数量来判断是否有表格。这只是一个简单的示例,具体的判断方法和算法需要根据具体情况

    2024年02月16日
    浏览(42)
  • Python Opencv实践 - 全景图片拼接stitcher

            由于手里没有切割好的全景图片资源,因此首先写了一个切片的程序spliter。         如果有现成的切割好的待拼接的切片文件,则不需要使用spliter。         对于全景图片的拼接,需要注意一点,各个切片图片之间要有重复的内容以便opencv能够提取到关键点并

    2024年02月22日
    浏览(49)
  • Python 图片处理

    Step1 提取PDF中的图片,并另存 Step2 去除灰色纸张背景 Step3  去除黑色边框 Step4 去除阴影部分,字清晰

    2024年02月09日
    浏览(21)
  • python+opencv生成较真实的车牌号码图片

    本文参考github代码:https://github.com/loveandhope/license-plate-generator  效果: 一、代码目录结构: background目录下存放各种背景图片  font目录下存放车牌中文、字符的ttf字体 images目录下存放蓝色底牌、新能源绿色底牌、污渍(噪声)的图片 完整代码可参考:https://download.csdn.net/d

    2024年02月02日
    浏览(47)
  • Python+OpenCV库实现对倾斜图片的校正

    前言 一、设计思路 二、编程步骤 三、代码实现 四、测试结果 总结         本实验旨在利用OpenCV库实现对倾斜图片的校正,并通过鼠标交互方式选择图片的边界点,以便进行透视变换和图像裁剪,代码简洁,适合初学者参考学习。         首先,我们需要读取一张倾

    2024年02月21日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包