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柱状图
考虑其他方法。
验证使用的图片
相关文章:
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( Inp…...
SpringCloud Ribbon--负载均衡 原理及应用实例
😀前言 本篇博文是关于SpringCloud Ribbon的基本介绍,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力…...
Redis的介绍以及简单使用
Redis(Remote Dictionary Server)是一个开源的内存数据存储系统,它以键值对的形式将数据存在内存中,并提供灵活、高性能的数据访问方式。Redis具有高速读写能力和丰富的数据结构支持,可以广泛应用于缓存、消息队列、实…...
ad18学习笔记十二:如何把同属性的元器件全部高亮?
1、先选择需要修改的器件的其中一个。 2、右键find similar objects,然后在弹出的对话框中,将要修改的属性后的any改为same 3、像这样勾选的话,能把同属性的元器件选中,其他器件颜色不变 注意了,如果这个时候ÿ…...
SpringSecurity 核心过滤器——SecurityContextPersistenceFilter
文章目录 前言过滤器介绍用户信息的存储获取用户信息存储用户信息获取用户信息 处理逻辑总结 前言 SecurityContextHolder,这个是一个非常基础的对象,存储了当前应用的上下文SecurityContext,而在SecurityContext可以获取Authentication对象…...
反转单链表
思路图1: 代码: struct ListNode* reverseList(struct ListNode* head){if(headNULL)//当head是空链表时 {return head; }struct ListNode* n1NULL;struct ListNode* n2head;struct ListNode* n3head->next;if(head->nextNULL)//当链表只有一个节…...
加速新药问世,药企如何利用云+网的优势?
随着计算能力的不断提高和人工智能技术的迅速发展,药物研发领域正迎来一场革命。云端强大的智能算法正成为药物研发企业的得力助手,推动着药物的精确设计和固相筛选。这使得药物设计、固相筛选以及药物制剂开发的时间大幅缩短,有望加速新药物…...
C++中string对象之间比较、char*之间比较
#include <cstring> //char* 使用strcmp #include <string> //string 使用compare #include <iostream> using namespace std; int main() {string stringStr1 "42";string stringStr2 "42";string stringStr3 "213";cout …...
MVVM模式理解
链接: MVVM框架理解及其原理实现 - 知乎 (zhihu.com) 重点: 1.将展示的界面窗口和创建的构件是数据进行分离 2.利用一个中间商进行数据的处理,所有的数据通过中间商进行处理...
js常用的数组处理方法
some 方法 用于检查数组中是否至少有一个元素满足指定条件。如果有满足条件的元素,返回值为 true,否则返回 false。 const numbers [1, 2, 3, 4, 5];const hasEvenNumber numbers.some((number) > number % 2 0); console.log(hasEvenNumber); /…...
[Document]VectoreStoreToDocument开发
该document是用来检索文档的。 第一步:定义组件对象,该组件返回有两种类型:document和text。 第二步:获取需要的信息,向量存储库,这里我使用的是内存向量存储(用该组件拿到文档,并检…...
【LeetCode-简单题】225. 用队列实现栈
文章目录 题目方法一:单个队列实现 题目 方法一:单个队列实现 入栈 和入队正常进行出栈的元素其实就是队列的尾部元素,所以直接将尾部元素弹出即可,其实就可以将除了最后一个元素的其他元素出队再加入队,然后弹出队首元…...
数据预处理方式合集
删除空行 #del all None value data_all.dropna(axis1, howall, inplaceTrue) 删除空列 #del all None value data_all.dropna(axis0, howall, inplaceTrue) 缺失值处理 观测缺失值 观测数据缺失值有一个比较好用的工具包——missingno,直接传入DataFrame&…...
【前端】jquery获取data-*的属性值
通过jquery获取下面data-id的值 <div id"getId" data-id"122" >获取id</div> 方法一:dataset()方法 //data-前缀属性可以在JS中通过dataset取值,更加方便 console.log(getId.dataset.id);//112//赋值 getId.dataset.…...
GB28181学习(五)——实时视音频点播(信令传输部分)
要求 实时视音频点播的SIP消息应通过本域或其他域的SIP服务器进行路由、转发,目标设备的实时视音频流宜通过本域的媒体服务器进行转发;采用INVITE方法实现会话连接,采用RTP/RTCP协议实现媒体传输;信令流程分为客户端主动发起和第…...
单例模式(饿汉模式 懒汉模式)与一些特殊类设计
文章目录 一、不能被拷贝的类 二、只能在堆上创建类对象 三、只能在栈上创建类对象 四、不能被继承的类 五、单例模式 5、1 什么是单例模式 5、2 什么是设计模式 5、3 单例模式的实现 5、3、1 饿汉模式 5、3、1 懒汉模式 🙋♂️ 作者:Ggggggtm &#x…...
133. 克隆图
133. 克隆图 题目-中等难度示例1. bfs 题目-中等难度 给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。…...
交流耐压试验目的
试验目的 交流耐压试验是鉴定电力设备绝缘强度最有效和最直接的方法。 电力设备在运行中, 绝缘长期受着电场、 温度和机械振动的作用会逐渐发生劣化, 其中包括整体劣化和部分劣化,形成缺陷, 例如由于局部地方电场比较集中或者局部…...
使用 YCSB 和 PE 进行 HBase 性能压力测试
HBase主要性能压力测试有两个,一个是 HBase 自带的 PE,另一个是 YCSB,先简单说一个两者的区别。PE 是 HBase 自带的工具,开箱即用,使用起来非常简单,但是 PE 只能按单个线程统计压测结果,不能汇…...
正则表达式相关概念及不可见高度页面的获取
12.正则 概念:匹配有规律的字符串,匹配上则正确 1.正则的创建方式 构造函数创建 // 修饰符 igm// i 忽视 ignore// g global 全球 全局// m 换行 var regnew RegExp("匹配的内容","修饰符")var str "this is a Box";var reg new RegExp(&qu…...
深入学习 Redis - 分布式锁底层实现原理,以及实际应用
目录 一、Redis 分布式锁 1.1、什么是分布式锁 1.2、分布式锁的基础实现 1.2.1、引入场景 1.2.2、基础实现思想 1.2.3、引入 setnx 1.3、引入过期时间 1.4、引入校验 id 1.5、引入 lua 脚本 1.5.1、引入 lua 脚本的原因 1.5.2、lua 脚本介绍 1.6、过期时间续约问题&…...
Hive行转列[一行拆分成多行/一列拆分成多列]
场景: hive有张表armmttxn_tmp,其中有一个字段lot_number,该字段以逗号分隔开多个值,每个值又以冒号来分割料号和数量,如:A3220089:-40,A3220090:-40,A3220091:-40,A3220083:-40,A3220087:-40,A3220086:-4…...
TypeScript系列之类型 string
文章の目录 背景写在最后 背景 与JavaScript不同的是,TypeScript使用的是静态类型,比如说它指定了变量可以保存的数据类型。如下面代码所示,如果在JavaScript中,指定变量可以保存的数据类型,会报错:类型注…...
【C++】动态内存管理 ③ ( C++ 对象的动态创建和释放 | new 运算符 为类对象 分配内存 | delete 运算符 释放对象内存 )
文章目录 一、C 对象的动态创建和释放1、C 语言 对象的动态创建和释放 的方式2、C 语言 对象的动态创建和释放 的方式 二、代码示例 - 对象的动态创建和释放 一、C 对象的动态创建和释放 使用 C 语言中的 malloc 函数 可以为 类对象 分配内存 ; 使用 free 函数可以释放上述分配…...
AMS爆炸来袭,上线即巅峰
1.关于首发项目Antmons(AMS)空投结果 Gate.io Startup 首发项目Antmons代币AMS于Aug15th,AM 07:00开始下单,24小时内下单同等对待总共有15,950人下单,下单总价值超过1,000万美金分发系数约为0.001640495298341。根据上线规则AMS项目认购成功,…...
是面试官放水,还是公司实在是太缺人?这都没挂,华为原来这么容易进...
华为是大企业,是不是很难进去啊?” “在华为做软件测试,能得到很好的发展吗? 一进去就有9.5K,其实也没有想的那么难” 直到现在,心情都还是无比激动! 本人211非科班,之前在字节和腾…...
怒刷LeetCode的第2天(Java版)
目录 第一题 题目来源 题目内容 解决方法 方法一:滑动窗口 方法二:双指针加哈希表 第二题 题目来源 题目内容 解决方法 方法一:二分查找 方法二:归并排序 方法三:分治法 第三题 题目来源 题目内容 解…...
AUTOSAR汽车电子嵌入式编程精讲300篇-车载CAN总线网络的异常检测(续)
目录 车载 CAN 总线网络异常检测技术 3.1 车载 CAN 总线网络异常检测技术概述 3.1.1基于统计的异...
mojo安装
docker安装mojo 官网 https://developer.modular.com/login 很奇怪登录页面不显示 类似于网站劫持 docker 安装mojo带jupyterlab的方式 https://hub.docker.com/r/lmq886/mojojupyterlab 拉取镜像 docker pull lmq886/mojojupyterlab docker pull lmq886/mojojupyterlab:1.2 启…...
【探索Linux】—— 强大的命令行工具 P.8(进程地址空间)
阅读导航 前言一、内存空间分布二、什么是进程地址空间1. 概念2. 进程地址空间的组成 三、进程地址空间的设计原理1. 基本原理2. 虚拟地址空间 概念 大小和范围 作用 虚拟地址空间的优点 3. 页表 四、为什么要有地址空间五、总结温馨提示 前言 前面我们讲了C语言的基础知识&am…...
网站的购物车怎么做/全国seo搜索排名优化公司
问题 在序列化枚举字段的时候,出现只序列化一个string的枚举名字。这对于普通java枚举类问题不大的,但是对于稍复杂一点java枚举类,就会出现字段丢失的情况。例如,如下枚举类: import com.fasterxml.jackson.annotati…...
如何在自己的网站上做直播/广州seo公司
前言 在Android开发中ListView是最为经常使用的控件之中的一个,基本每一个应用都会涉及到它,要使用ListView列表展示,就不可避免地涉及到另外一个东西——Adapter,我们都知道,Adapter是连接数据和列表界面的一个桥梁,一…...
免费用的云服务器/seo网站排名软件
在这里插入代码片45个Vue开源项目汇总在过去的一年里,我们比较了将近 12,000 个 Vue.js 开源项目和库,从中挑选了最好的 45 个 这些项目和库可以分为 3 类:1.用户界面(1~19)2.Vue.js 工具(20~36)3.项目(37~45)这是一个非常好的清单,精心挑选了 2018 年 1 月至 12 月期…...
邢台做网站推广报价/杭州龙席网络seo
利用LVSKeepalived 实现高性能高可用负载均衡 背景: 随着你的网站业务量的增长你网站的服务器压力越来越大?需要负载均衡方案!商业的硬件如F5又太贵,你们又是创业型互联公司如何有效节约成本,节省不必要的浪费?同时实现…...
淄博哪里有做网站的/seo工具包
回想Engineer类的数据成员,有眼镜、背包等。某Engineer的眼镜、背包,是Glass、Bag类的对象。类中的数据成员,其类型可以是简单类型,也可以是类。通过这种方式,将某些类组合到另外的类中,当作其中的一个“部…...
洛阳网站建设报价/旺道seo推广效果怎么样
转自:http://blog.csdn.net/Times_poem/article/details/51396826 转载于:https://www.cnblogs.com/sky-heaven/p/7217685.html...