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 = 3bottom = bottom + boderheight = height - (boder * 2)left = left + boderwidth = 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=0lnum = 0n = 10for a in x_black:lnum = lnum + 1if tmp == a:tmp = tmp + 1else:#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 = 7image[(ymax+yn):(ymax+1+yn), 0:, :] = (0, 0, 0) #debugimage[(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 imagecv2.imwrite("./3_fenge.jpg",remove_the_blackborder("3_biankuang.jpg"))

原始图像

纵向清理

纵向+横向清理

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

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

下一步优化算法:

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到灰度的转换# debugcv2.imwrite('3_xheibai.jpg',binary_image)#edges_y, edges_x = np.where(binary_image < 127) ##h, w#选取有颜色(RGB < 127)点的坐标# debugprint(len(binary_image))print(binary_image)#xavgRGB = {}xNum=0xavyRGB=[]for ils in binary_image:xNum = xNum+1mavg =255 - np.mean(ils)   #取反# 去除边框if(mavg > 250):mavg=0xavyRGB.append(mavg)# debugplt.bar(xNum, mavg)print(xNum)plt.savefig("./3_xavyRGB.png")clean_Zang_background_by_Fengge("0004_page_0004.jpg")

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

考虑其他方法。

验证使用的图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

买卖股票的最佳时机

一、题目。 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置…

2023年云南省职业院校技能大赛中职组“网络安全”赛项样题

2023年云南省职业院校技能大赛 中职组“网络安全”赛项样题 一、竞赛时间 总计&#xff1a;180分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A、B模块 A-1 登录安全加固 180分钟 200分 A-2 数据库加固 A-3 服务加固SSH\VSFTPD A-4 防火墙策…

php预约系统源码 网上预约小程序开发源码 整套系统搭建让在线预约更便捷

随着互联网技术的发展&#xff0c;越来越多的服务行业开始通过网上预约系统来实现便捷的客户管理和服务提供。PHP预约系统源码作为一种成熟的技术方案&#xff0c;可以帮助商家快速搭建自己的预约系统&#xff0c;提高工作效率&#xff0c;优化客户体验。 分享一个php预约系统…

常见的排序算法及时间空间复杂度

排序算法是计算机科学中的基本算法之一&#xff0c;它用于将一组数据按照某种顺序进行排列。下面是一些常见的排序算法&#xff0c;以及它们的思想和时间空间复杂度&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢…

Python日期处理库:掌握时间的艺术

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 日期和时间在计算机编程…

《中国数字经济发展指数报告(2023年)》发布

导读 国家统计局《数字经济及其核心产业统计分类(2021)》首次对数字经济及其核心产业统计分类做出详细说明。然而&#xff0c;由于数字经济内涵外延的不断丰富&#xff0c;区域数字经济发展的量化评估仍在持续发展的过程中&#xff0c;以量化模型方式能够更加客观全面反映新时…

flash attention的CUDA编程和二维线程块实现softmax

本文参考了链接添加链接描述 flash attention介绍 flash attention的介绍可以参考论文:FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness,具体的数学公式参考下面这个图片:其中注意关于矩阵S有两个维度,softmax的操作维度是dim=1,用pytorc…

【HarmonyOS】元服务卡片router实现跳转到指定页面

【关键字】 元服务卡片、router跳转不同页面 【写在前面】 本篇文章主要介绍开发元服务卡片时&#xff0c;如何实现从卡片中点击事件跳转到指定的应用内页面功能。此处以JS UI开发服务卡片为例&#xff0c;JS卡片支持组件设置action&#xff0c;包括router事件和message事件&…

蒙特卡洛方法的数学基础-1

蒙特卡洛方法的数学基础-1 概率论 Bayes 公式 常用分布 Binominal Distribution Poisson Distribution Gaussian Distribution Exponential Distribution Uniform Distribution 大数定理 均匀概率分布随机地取N个数xi &#xff0c;函数值之和的算术平均收敛于函数的期望值 …

基于nRF7002-DK的NFC功能切换系统(nRF Connect SDK+NFC)

目录 项目介绍硬件介绍项目设计开发环境及工程目录总体流程图硬件初始化NFC功能实现文本记录安卓应用打开按键切换功能 功能展示项目总结 &#x1f449; 【Funpack2-6】基于nRF7002-DK的NFC功能切换系统 &#x1f449; Github: EmbeddedCamerata/nRF7002-DK-nfc-function-switc…

ADS放大器模型参数含义

ADS放大器模型参数含义 S21 : Forward Transmission Coefficient, use xj*y, polar(x,y), dbpolar(x,y) for complex value 增益&#xff0c;X是增益大小&#xff0c;y是相位 S11 : Forward Reflection Coefficient, use xj*y, polar(x,y), dbpolar(x,y), vswrpolar(x,y) for …

新手学习:ArcGIS对shp文件裁剪

新手学习&#xff1a;ArcGIS对SHP文件裁剪 新手学习 记录每个步骤&#xff0c;因为有很多控件可能刚开始还不熟悉&#xff0c;根本不知道在哪里&#xff0c;所以写的比较详细。 1.添加要裁剪的shp文件 2.查看shp文件的地理坐标系 双击shp文件&#xff0c;就可以查看shp文件的…

C语言——贪吃蛇小游戏

目录 一、ncurse 1.1 为什么需要用ncurse&#xff1a; 1.2 ncurse的输入输出&#xff1a; 1.2.1 如何使用ncurse&#xff1a; 1.2.2 编译ncurse的程序&#xff1a; 1.2.3 测试输入一个按键ncurse的响应速度&#xff1a; 1.3 ncurse上下左右键获取&#xff1a; 1.3.1 如…

TypeScript 从入门到进阶之基础篇(一) ts类型篇

系列文章目录 文章目录 系列文章目录前言一、安装必要软件二、TypeScript 基础类型1.基础类型之 数字类型 number2.基础类型之 字符串类型 string3.基础类型之 布尔类型 boolean4.基础类型之 空值类型 void5.基础类型之 null 、undefined类型6.基础类型之 任意类型 any &#x…

解决ModuleNotFoundError: No module named ‘diffusers.models.cross_attention‘

目录 项目场景: 问题描述 原因分析: 解决方案: 方案一:

面向面试知识--Lottery项目

面向面试知识–Lottery项目 1.设计模式 为什么需要设计模式&#xff1f; &#xff08;设计模式是什么&#xff1f;优点有哪些&#xff1f;&#xff09; 设计模式是一套经过验证的有效的软件开发指导思想/解决方案&#xff1b;提高代码的可重用性和可维护性&#xff1b;提高团…

vue3 - Element Plus暗黑模式适配、切换及自定义颜色

GitHub Demo 地址 在线预览 Element Plus 2.2.0 版本开始支持暗黑模式&#xff0c;启用方式参考 Element Plus 官方文档 - 暗黑模式 demo通过Element Plus和VueUse 的 useDark 方法实现具有自动数据持久性的响应式暗黑模式。 安装 npm install element-plus --save npm in…

canvas-绘图库fabric.js简介

一般情况下简单的绘制&#xff0c;其实canvas原生方法也可以满足&#xff0c;比如画个线&#xff0c;绘制个圆形、正方形、加个文案。 let canvas document.getElementById(canvas);canvas.width 1200;canvas.height 600;canvas.style.width 1200px;canvas.style.height 6…

R绘制箱线图

代码大部分来自boxplot()函数的帮助文件&#xff0c;可以通过阅读帮助文件&#xff0c;调整代码中相应参数看下效果&#xff0c;进而可以理解相应的作用&#xff0c;帮助快速掌握barplot()函数的用法。 语法 Usage(来自帮助文件) barplot(height, ...)## Default S3 method: …

就只说 3 个 Java 面试题

在面试时&#xff0c;即使是经验丰富的开发人员&#xff0c;也可能会发现这是一些很棘手的问题&#xff1a; 1、Java中“transient”关键字的用途是什么&#xff1f;如何才能实现这一目标&#xff1f; 在 Java 中&#xff0c;“transient”关键字用于指示类的特定字段不应包含…