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.rhkb.cn/news/137222.html

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

相关文章

Qt---day4---9.20

qt完成时钟&#xff1a; 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include <QtDebug> #include <QPainter> #include <QTimerEvent> #include <QTime>QT_BEGIN_NAMESPACE names…

wpf资源Resources探究性学习(一)

测试环境&#xff1a; vistual studio 2017 .net framework 3.5 window 10 新建WPF应用(.net framework)&#xff0c;项目名称为&#xff1a;WpfDemo&#xff0c;如下图&#xff1a; 新建完项目后&#xff0c;默认带有一个名为MainWindow.xaml的代码 一 简单使用字符串资源…

OpenCV实现“蓝线挑战“特效

原理 算法原理可以分为三个流程&#xff1a; 1、将视频&#xff08;图像&#xff09;从&#xff08;顶->底&#xff09;或&#xff08;左->右&#xff09;逐行&#xff08;列&#xff09;扫描图像。 2、将扫描完成的行&#xff08;列&#xff09;像素重新生成定格图像…

蓝桥杯 题库 简单 每日十题 day6

01 删除字符 题目描述 给定一个单词&#xff0c;请问在单词中删除t个字母后&#xff0c;能得到的字典序最小的单词是什么&#xff1f; 输入描述 输入的第一行包含一个单词&#xff0c;由大写英文字母组成。 第二行包含一个正整数t。 其中&#xff0c;单词长度不超过100&#x…

【卖出备兑看涨期权策略(Covered_call)】

卖出备兑看涨期权策略&#xff08;Covered_call&#xff09; 卖出备兑看涨期权策略是一种最基本的收入策略&#xff0c;该策略主要操作就是在持有标的资产的同时卖出对应的看涨期权合约&#xff0c;以此来作为从持有的标的资产中获取租金的一种方法。如果标的资产的价格上涨到…

Pikachu XSS(跨站脚本攻击)

文章目录 Cross-Site ScriptingXSS&#xff08;跨站脚本&#xff09;概述反射型[xss](https://so.csdn.net/so/search?qxss&spm1001.2101.3001.7020)(get)反射型xss(post)存储型xssDOM型xssDOM型xss-xxss-盲打xss-过滤xss之htmlspecialcharsxss之href输出xss之js输出 Cros…

前端--HTML

文章目录 HTML结构快速生成代码框架HTML常见标签 表格标签 编写简历信息 填写简历信息 Emmet 快捷键 HTML 特殊字符 一、HTML结构 1.认识HTML标签 HTML 代码是由 "标签" 构成的. 形如: <body>hello</body> 标签名 (body) 放到 < > 中 大部分标…

华为手机如何开启设置健康使用手机模式限制孩子玩手机时间?

华为手机如何开启设置健康使用手机模式限制孩子玩手机时间&#xff1f; 1、在手机上找到「设置」并点击打开&#xff1b; 2、在设置内找到「健康使用手机」并点击进入&#xff1b; 3、开启健康使用手机后&#xff0c;选择孩子使用&#xff1b; 4、在健康使用手机内&#xff0c…

使用Arduino简单测试HC-08蓝牙模块

目录 模块简介模块测试接线代码测试现象 总结 模块简介 HC-08 蓝牙串口通信模块是新一代的基于 Bluetooth Specification V4.0 BLE 蓝牙协议的数传模块。无线工作频段为 2.4GHz ISM&#xff0c;调制方式是 GFSK。模块最大发射功率为4dBm&#xff0c;接收灵度-93dBm&#xff0c…

SpringSecurity 核心过滤器——SecurityContextPersistenceFilter

文章目录 前言过滤器介绍用户信息的存储获取用户信息存储用户信息获取用户信息 处理逻辑总结 前言 SecurityContextHolder&#xff0c;这个是一个非常基础的对象&#xff0c;存储了当前应用的上下文SecurityContext&#xff0c;而在SecurityContext可以获取Authentication对象…

基于SSM+Vue的乐购游戏商城系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

沈阳建筑大学《乡村振兴战略下传统村落文化旅游设计》 许少辉八一著作

沈阳建筑大学《乡村振兴战略下传统村落文化旅游设计》 许少辉八一著作

playwright的安装与使用

一、安装 所有安装严格按照指定版本&#xff0c;不然可能会报错&#xff0c;为啥报错我也不知道 1、准备环境 win10&#xff08;playwright好像不支持win7 python2&#xff09; 2、 安装python3.7.9&#xff08;这个是为了兼容robot&#xff09; https://www.python.org/do…

数学建模__非线性规划Python实现

使用到的是scipy库 线性规划指的是目标模型均为线性&#xff0c;除此以外的都是非线性规划&#xff0c;使用scipy提供的方法对该类问题进行求解。 from scipy.optimize import minimize import numpy as np#定义目标函数 def fun(args):a,b,c,d argsv lambda x: (ax[0])/ (b…

SpringMVC的拦截器和JSR303的使用

目录 一、JSR303 二、拦截器&#xff08;interceptor&#xff09; 一、JSR303 1.1.什么是JSR303 JSR 303&#xff0c;它是Java EE&#xff08;现在称为Jakarta EE&#xff09;规范中的一部分。JSR 303定义了一种用于验证Java对象的标准规范&#xff0c;也称为Bean验证。 Bean验…

mybatis-plus异常:dynamic-datasource can not find primary datasource

现象 使用mybatis-plus多数据源配置时出现异常 com.baomidou.dynamic.datasource.exception.CannotFindDataSourceException: dynamic-datasource can not find primary datasource分析 异常原因是没有设置默认数据源&#xff0c;在类上没有使用DS指定数据源时&#xff0c;默…

Jenkins自动化:简化部署流程

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

ad18学习笔记十二:如何把同属性的元器件全部高亮?

1、先选择需要修改的器件的其中一个。 2、右键find similar objects&#xff0c;然后在弹出的对话框中&#xff0c;将要修改的属性后的any改为same 3、像这样勾选的话&#xff0c;能把同属性的元器件选中&#xff0c;其他器件颜色不变 注意了&#xff0c;如果这个时候&#xff…

拓扑关系如何管理?

在设备对接涂鸦的云端过程中&#xff0c;一部分设备由于自身资源或硬件配置&#xff0c;无法直接连接云端。而是需要通过网关进行中转&#xff0c;由网关代理实现和云端进行数据交互&#xff0c;间接实现设备接入云端。这样的设备也称为子设备。 要想实现网关代理子设备接入云…

1.简单工厂模式

UML类图 代码 main.cpp #include <iostream> #include "OperationFactory.h" using namespace std;int main(void) {float num1;float num2;char operate;cin >> num1 >> num2 >> operate;Operation* oper OperationFactory::createOpera…