Python3 图像边界识别
# -*- coding: utf-8 -*-
"""
Created on Wed Mar 7 11:04:15 2018 @author: markli
"""
import numpy as np;
from PIL import Image;
import matplotlib.pyplot as pyplot;
class ImageFilter:
def __init__(self,filepath):
self.path = filepath; def Filter(self,filtermatrix):
"""步长设定为1"""
img = Image.open(self.path);
#img = img.resize((32,32));
r,g,b = img.split(); #rgb 通道分离
#转为数字矩阵
r_arr = np.array(r);
g_arr = np.array(g);
b_arr = np.array(b); matrix = [r_arr,g_arr,b_arr];
#过滤后的结果矩阵
fm = np.ones((r_arr.shape[0] - filtermatrix.shape[0] + 1,r_arr.shape[1] - filtermatrix.shape[1]+1));
fm_rgb = [];
#卷积运算 实现过滤
for m in matrix:
row = 0;
for i in range(fm.shape[0]):
col = 0;
for j in range(fm.shape[1]):
temp = m[row:row + filtermatrix.shape[0],col:col + filtermatrix.shape[1]];
fm[i][j] = np.sum(np.multiply(temp,filtermatrix));
col = col + 1;
row = row + 1; fm_rgb.append(fm); return fm_rgb;
# #数字矩阵转为RGB通道像素
# r = Image.fromarray(fm_rgb[0]).convert('L');
# g = Image.fromarray(fm_rgb[1]).convert('L');
# b = Image.fromarray(fm_rgb[2]).convert('L');
# image = Image.merge("RGB", (r, g, b));
# #图片显示
# pyplot.imshow(image);
# pyplot.show();
def MergeEdage(self,savepath):
leftmatrix = np.array([[1,0,-1],[1,0,-1],[1,0,-1]]);#左边界
left = self.Filter(leftmatrix);
rightmatrix = np.array([[-1,0,1],[-1,0,1],[-1,0,1]]);#右边界
right = self.Filter(rightmatrix);
w_1,h_1 = left[0].shape; #left 和 right 维数相同,使用哪个都可以
full_edage = [];
for i in range(3):
m = np.hstack((left[i][:,:int(w_1/2)],right[i][:,w_1-int(w_1/2):]));
full_edage.append(m); #数字矩阵转为RGB通道像素
r = Image.fromarray(full_edage[0]).convert('L');
g = Image.fromarray(full_edage[1]).convert('L');
b = Image.fromarray(full_edage[2]).convert('L');
image = Image.merge("RGB", (r, g, b));
#图片显示
pyplot.imshow(image);
pyplot.show();
image.save(savepath); img = ImageFilter("C:\\Users\\yangp\\Desktop\\612474963277897033.jpg");
img.MergeEdage("C:\\Users\\yangp\\Desktop\\fulledage.jpg");
下面给出原图、左边界和右边界识别情况:


最后是将左右边界合并,形成整体:

最后说明一下,其中的过滤矩阵可以扩大,将过滤矩阵值的变化放慢,可以使图像的识别更加细致,在这里本人的电脑配置太低,就不演示了。当然图片的轮廓可以使用Image库中的filter方法显现出来,语法是img = Image.open("C:\\Users\\yangp\\Desktop\\612474963277897033.jpg");img.filter(ImageFilter.FIND_EDGES);img.show();
Python3 图像边界识别的更多相关文章
- [免费下载应用]iNeuKernel.Ocr 图像数据识别与采集原理和产品化应用
目 录 1..... 应用概述... 2 2..... 免费下载试用... 2 3..... 视频介绍... 2 4..... iNeuLink.Ocr图像数据采集应用... 2 5... ...
- [OpenCV]拓展图像边界
图像处理中经常遇到使用当前像素邻的像素来计算当前像素位置的某些属性值,这样就会导致边界像素处越界访问,一般有两种方法解决这种问题:只对不越界的像素进行处理:对图像边界进行拓展,本文主要介绍如何使用Op ...
- Java基于opencv实现图像数字识别(五)—投影法分割字符
Java基于opencv实现图像数字识别(五)-投影法分割字符 水平投影法 1.水平投影法就是先用一个数组统计出图像每行黑色像素点的个数(二值化的图像): 2.选出一个最优的阀值,根据比这个阀值大或小 ...
- Java基于opencv实现图像数字识别(四)—图像降噪
Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...
- Java基于opencv实现图像数字识别(三)—灰度化和二值化
Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...
- Java基于opencv实现图像数字识别(二)—基本流程
Java基于opencv实现图像数字识别(二)-基本流程 做一个项目之前呢,我们应该有一个总体把握,或者是进度条:来一步步的督促着我们来完成这个项目,在我们正式开始前呢,我们先讨论下流程. 我做的主要 ...
- Java基于opencv实现图像数字识别(一)
Java基于opencv实现图像数字识别(一) 最近分到了一个任务,要做数字识别,我分配到的任务是把数字一个个的分开:当时一脸懵逼,直接百度java如何分割图片中的数字,然后就百度到了用Buffere ...
- 【python-opencv】18-图像梯度+图像边界
效果图: *一阶导数与Soble算子 *二阶导数与拉普拉斯算子 定义:把图片想象成连续函数,因为边缘部分的像素值是与旁边像素明显有区别的,所以对图片局部求极值,就可以得到整幅图片的边缘信息了. 不过图 ...
- opencv —— copyMakeBorder 扩充图像边界
扩充图像边界:copyMakeBorder 函数 在图像处理过程中,因为卷积算子有一定大小,所以就会导致图像一定范围的边界不能被处理,这时就需要将边界进行适当扩充. void copyMakeBord ...
随机推荐
- [转]gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 参数详解
背景 有时我们的程序会定义一些暂时使用不上的功能和函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的ROM和RAM的空间.这在使用静态库时,体现的更为严重.有时,我们只使用了静态库仅有的几个功 ...
- 20165230田坤烨《网络对抗》Exp1 PC平台逆向破解
实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShe ...
- SpringBoot整合Jest操作ES
(1).添加依赖 <dependency> <groupId>io.searchbox</groupId> <artifactId>jest</a ...
- 【干货】从windows注册表读取重要信息-----这种技能非常重要,占电子取证的70%
也就是说,当我拿着U盘启动盘,从你电脑里面拷贝了注册表的几个文件,大部分数据就已经到我手中了.一起来感受一下吧. 来源:Unit 6: Windows File Systems and Registr ...
- 一步步实现windows版ijkplayer系列文章之四——windows下编译ijkplyer版ffmpeg
一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...
- 大型NodeJS项目架构与优化
使用场景: proxy(API冗余,跨域) vue ssr(服务端渲染) socket(大并发,通讯) 区块链(创业公司,新兴行业) 讨论什么? NodeJS异步IO原理及优化方案 NodeJS内存管 ...
- Python最佳学习路线图
python语言基础(1)Python3入门,数据类型,字符串(2)判断/循环语句,函数,命名空间,作用域(3)类与对象,继承,多态(4)tkinter界面编程(5)文件与异常,数据处理简介(6)Py ...
- 前端工程化之webpack中配置babel-loader(四)
安装 安装:npm i -D babel-core babel-loader babel-plugin-transform-runtime 安装:npm i -D babel-preset-es201 ...
- google 与服务器搭建
一.申请账号 二.创建实例 VPN设置 :https://juejin.im/post/5b665a51f265da0f7d4f1ab3
- xxx is not in sudoers file 解决(转)
解决方案:首需要切换到root身份$su -(注意有- ,这和su是不同的,在用命令"su"的时候只是切换到root,但没有把root的环境变量传过去,还是当前用户的环境变量,用& ...