Python 第三方opencv库实现图像分割处理

目录
  • 前言
  • 1.加载图片
  • 2.对图片做灰度处理
  • 3.对图片做二值化处理
    • 3.1.自定义阈值
  • 4.提取轮廓
  • 5.对轮廓画矩形框
  • 6.分割图片并保存
  • 7.查看分割图片
  • 8.完整代码

前言

所需要安装的库有:

pip install opencv-python

pip install matplotlib

Python接口帮助文档网址https://docs.opencv.org/4.5.2/d6/d00/tutorial_py_root.html

本文所用到的图片素材:

首先,导入所用到的库:

import cv2
import os,shutil
from matplotlib import pyplot as plt

1.加载图片

注意:这里在传入图像路径时,路径中不能包含有中文名,否则会报错!!!

###1,加载图片
filepath = './testImage.png'  ###图像路径,注意:这里的路径不能包含有中文名
img = cv2.imread(filepath)
cv2.imshow('Orignal img', img)  ###显示图片
cv2.waitKey(0) ###防止一闪而过,是一个键盘绑定函数(0表示按下任意键终止)

2.对图片做灰度处理

###2,将彩色图片变为灰色(进行灰度处理)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('img_gray', img_gray)
cv2.waitKey(0)

3.对图片做二值化处理

thresh=220是自定义设定的阈值(通过分析print(img_gray)的图像数据大概得到的),像素值大于220被置成了0,小于220的被置成了255。

maxval=与 THRESH_BINARY 和 THRESH_BINARY_INV 阈值一起使用的最大值,可理解是填充色,范围为(0~255)。

type:参数类型阈值类型( cv2.THRESH_BINARY 大于阈值的部分被置为255,小于部分被置为0(黑白二值) cv2.THRESH_BINARY_INV 大于阈值部分被置为0,小于部分被置为255(黑白二值反转——白黑) 等其它的类型...... )

###3,将图片做二值化处理
    '''
        thresh=220是自定义设定的阈值(通过分析print(img_gray)的图像数据大概得到的),像素值大于220被置成了0,小于220的被置成了255
        maxval=与 THRESH_BINARY 和 THRESH_BINARY_INV 阈值一起使用的最大值,可理解是填充色,范围为(0~255)。
        type:参数类型阈值类型(
              cv2.THRESH_BINARY 大于阈值的部分被置为255,小于部分被置为0(黑白二值)
              cv2.THRESH_BINARY_INV 大于阈值部分被置为0,小于部分被置为255(黑白二值反转——白黑)
              等其它的类型......
              )
        '''
ret, img_inv = cv2.threshold(src=img_gray, thresh=220, maxval=255, type=cv2.THRESH_BINARY_INV)
cv2.imshow('img_inv', img_inv)
cv2.waitKey(0)

3.1.自定义阈值

###阈值对比(全局阈值(v = 127),自适应平均阈值,自适应高斯阈值)
def threshContrast():
    filepath = './testImage.png'
    img = cv2.imread(filepath)
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    img_gray = cv2.medianBlur(img_gray, 5)
    ret1, th1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
    th2 = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
    th3 = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
    title = ['原始图像(灰度)','全局阈值(v = 127)','自适应平均阈值','自适应高斯阈值']
    images = [img_gray, th1, th2, th3]
    for i in range(4):
        plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray')
        # plt.title(title[i]) ###plt绘图时不能使用中文
        plt.xticks([]), plt.yticks([])
    plt.show()

4.提取轮廓

img_inv是寻找轮廓的图像;

  • cv2.RETR_EXTERNAL:表示只检索极端外部轮廓;
  • cv2.CHAIN_APPROX_SIMPLE:压缩水平, 垂直和对角线方向的元素,只保留它们的端点坐标,例如,一个直立的矩形轮廓用 4 个点进行编码。
###4,提取轮廓
    '''
        https://docs.opencv.org/4.5.2/d4/d73/tutorial_py_contours_begin.html
        img_inv是寻找轮廓的图像;
        cv2.RETR_EXTERNAL:表示只检索极端外部轮廓;
        cv2.CHAIN_APPROX_SIMPLE:压缩水平, 垂直和对角线方向的元素,只保留它们的端点坐标,例如,一个直立的矩形轮廓用 4 个点进行编码。
    '''
 contours,hierarchy = cv2.findContours(img_inv, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
 print(f'检测出轮廓数量有:{len(contours)}个')
 print('返回值为各层轮廓的索引:\n', hierarchy)

5.对轮廓画矩形框

###5,找出每一个轮廓绘画出的矩形位置
br = []
cntid = 0
for cnt in contours:
        '''cnt表示输入的轮廓值,x,y, w, h 分别表示外接矩形的x轴和y轴的坐标,以及矩形的w宽和h高,'''
    x, y, w, h = cv2.boundingRect(cnt)
    cntid += 1
    print(f'检测出第{cntid}个轮廓画出的矩形位置为:x={x},y={y},w={w},h={h}')
    br.append(cv2.boundingRect(cnt))
        '''img表示输入的需要画的图片(这里就是在原图上绘制轮廓),cnt表示输入的轮廓值,-1表示contours中轮廓的索引(这里绘制所有的轮廓),(0, 0, 255)表示rgb颜色——红色,2表示线条粗细'''
    cv2.drawContours(img, [cnt], -1, (0, 0, 255), 2)
    cv2.imshow('cnt', img)
    cv2.waitKey(0)
br.sort() ###将列表中的每一个元组里面的进行升序排序(这里其实想的是按照对应的x轴坐标进行升序)

对每个字符画轮廓的过程(顺序从右到左画,期间也有可能断续,如下图)。

6.分割图片并保存

###6,分割图片并保存(这里对前面处理过的二值化图片数据(img_inv)进行分割)
if not os.path.exists('./imageSplit'):
    os.mkdir('./imageSplit')
else:
    shutil.rmtree('./imageSplit')
    os.mkdir('./imageSplit')
for x,y,w,h in br:
    # print(x,y,w,h)
    # split_image = img_inv[y:y + h, x:x + w]
    split_image = img_inv[y - 2:y + h + 2, x - 2:x + w + 2]  ###这样分割感觉好看些
    cv2.imshow('split_image', split_image)
    cv2.waitKey(0)
    save_filepath = './imageSplit/'
    filename = f'{x}.jpg' ###这里由每张图片对应的x轴坐标命名
    cv2.imwrite(save_filepath + filename, split_image)
    print(f'\033[31m{filename}图片分割完毕!\033[0m')

这里是对前面处理过的二值化图片数据(img_inv)进行一个一个字符分割展示的过程。

这里是这行代码的意思,下面的图是手动绘制的,太丑了,哈哈哈!!!

# split_image = img_inv[y:y + h, x:x + w]

7.查看分割图片

最后,我们在pyplot上来查看我们分割图片后的效果,也就终于完成了。

###7,用pyplot来查看我们分割完成后的图片
imagefile_list = os.listdir('./imageSplit')
imagefile_list.sort(key=lambda x: int(x[:-4]))
for i in range(len(imagefile_list)):
    img = cv2.imread(f'./imageSplit/{imagefile_list[i]}')
    plt.subplot(1, len(imagefile_list), i + 1), plt.imshow(img, 'gray')
    plt.title(imagefile_list[i])
    plt.xticks([]), plt.yticks([])
plt.show()

8.完整代码

import cv2
import os,shutil
from matplotlib import pyplot as plt
'''
    这是使用文档网址:https://docs.opencv.org/4.5.2/index.html
    这是提供的Python接口教程网址:https://docs.opencv.org/4.5.2/d6/d00/tutorial_py_root.html
'''
def imageSplit():
    ###1,加载图片
    filepath = './testImage.png'  ###图像路径,注意:这里的路径不能包含有中文名
    img = cv2.imread(filepath)
    cv2.imshow('Orignal img', img)  ###显示图片
    cv2.waitKey(0) ###防止一闪而过,是一个键盘绑定函数(0表示按下任意键终止)

    ###2,将彩色图片变为灰色(进行灰度处理)
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cv2.imshow('img_gray', img_gray)
    cv2.waitKey(0)

    ###3,将图片做二值化处理
    '''
        thresh=220是自定义设定的阈值(通过分析print(img_gray)的图像数据大概得到的),像素值大于220被置成了0,小于220的被置成了255
        maxval=与 THRESH_BINARY 和 THRESH_BINARY_INV 阈值一起使用的最大值,可理解是填充色,范围为(0~255)。
        type:参数类型阈值类型(
              cv2.THRESH_BINARY 大于阈值的部分被置为255,小于部分被置为0(黑白二值)
              cv2.THRESH_BINARY_INV 大于阈值部分被置为0,小于部分被置为255(黑白二值反转——白黑)
              等其它的类型......
              )
        '''
    ret, img_inv = cv2.threshold(src=img_gray, thresh=220, maxval=255, type=cv2.THRESH_BINARY_INV)
    cv2.imshow('img_inv', img_inv)
    cv2.waitKey(0)

    ###4,提取轮廓
    '''
        https://docs.opencv.org/4.5.2/d4/d73/tutorial_py_contours_begin.html
        img_inv是寻找轮廓的图像;
        cv2.RETR_EXTERNAL:表示只检索极端外部轮廓;
        cv2.CHAIN_APPROX_SIMPLE:压缩水平, 垂直和对角线方向的元素,只保留它们的端点坐标,例如,一个直立的矩形轮廓用 4 个点进行编码。
    '''
    contours,hierarchy = cv2.findContours(img_inv, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    print(f'检测出轮廓数量有:{len(contours)}个')
    print('返回值为各层轮廓的索引:\n', hierarchy)

    ###5,找出每一个轮廓绘画出的矩形位置
    br = []
    cntid = 0
    for cnt in contours:
        '''cnt表示输入的轮廓值,x,y, w, h 分别表示外接矩形的x轴和y轴的坐标,以及矩形的w宽和h高,'''
        x, y, w, h = cv2.boundingRect(cnt)
        cntid += 1
        print(f'检测出第{cntid}个轮廓画出的矩形位置为:x={x},y={y},w={w},h={h}')
        br.append(cv2.boundingRect(cnt))
        '''img表示输入的需要画的图片(这里就是在原图上绘制轮廓),cnt表示输入的轮廓值,-1表示contours中轮廓的索引(这里绘制所有的轮廓),(0, 0, 255)表示rgb颜色——红色,2表示线条粗细'''
        cv2.drawContours(img, [cnt], -1, (0, 0, 255), 2)
        cv2.imshow('cnt', img)
        cv2.waitKey(0)
    br.sort() ###将列表中的每一个元组里面的进行升序排序(这里其实想的是按照对应的x轴坐标进行升序)

    ###6,分割图片并保存(这里对前面处理过的二值化图片数据(img_inv)进行分割)
    if not os.path.exists('./imageSplit'):
        os.mkdir('./imageSplit')
    else:
        shutil.rmtree('./imageSplit')
        os.mkdir('./imageSplit')
    for x,y,w,h in br:
        # print(x,y,w,h)
        # split_image = img_inv[y:y + h, x:x + w]
        split_image = img_inv[y - 2:y + h + 2, x - 2:x + w + 2]  ###这样分割感觉好看些
        cv2.imshow('split_image', split_image)
        cv2.waitKey(0)
        save_filepath = './imageSplit/'
        filename = f'{x}.jpg' ###这里由每张图片对应的x轴坐标命名
        cv2.imwrite(save_filepath + filename, split_image)
        print(f'\033[31m{filename}图片分割完毕!\033[0m')
    cv2.destroyAllWindows() ###删除所有窗口

    ###7,用pyplot来查看我们分割完成后的图片
    imagefile_list = os.listdir('./imageSplit')
    imagefile_list.sort(key=lambda x: int(x[:-4]))
    for i in range(len(imagefile_list)):
        img = cv2.imread(f'./imageSplit/{imagefile_list[i]}')
        plt.subplot(1, len(imagefile_list), i + 1), plt.imshow(img, 'gray')
        plt.title(imagefile_list[i])
        plt.xticks([]), plt.yticks([])
    plt.show()

    print('\nperfect!!!')

###阈值对比(全局阈值(v = 127),自适应平均阈值,自适应高斯阈值)
def threshContrast():
    filepath = './testImage.png'
    img = cv2.imread(filepath)
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    img_gray = cv2.medianBlur(img_gray, 5)
    ret1, th1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
    th2 = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
    th3 = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
    title = ['原始图像(灰度)','全局阈值(v = 127)','自适应平均阈值','自适应高斯阈值']
    images = [img_gray, th1, th2, th3]
    for i in range(4):
        plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray')
        # plt.title(title[i]) ###plt绘图时不能使用中文
        plt.xticks([]), plt.yticks([])
    plt.show()

if __name__ == '__main__':
    imageSplit()

    ###阈值对比
    # threshContrast()

到此这篇关于Python 第三方opencv库实现图像分割处理的文章就介绍到这了,更多相关python图片处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python实现图片加文字水印OPenCV和PIL库

    目录 一:openCV给图片添加水印 二:使用PIL给图片添加水印 在python中我们可以使用openCV给图片添加水印,这里注意openCV无法添加汉字水印,添加汉字水印上可使用PIL库给图片添加水印 一:openCV给图片添加水印 1:安装openCV pip install opencv-python 2:使用openCV给图片添加水印实例: # -*- coding: utf-8 -*- import cv2 # 载入突破 img = cv2.imread('test.jpg') #

  • Python下opencv库的安装过程及问题汇总

    本文主要内容是python下opencv库的安装过程,涉及我在安装时遇到的问题,并且,将从网上搜集并试用的一些解决方案进行了简单的汇总,记录下来. 由于记录的是我第一次安装opencv库的过程,所以内容涵盖可能不全面,如果有出错的地方请务必指正.下面进入主题. 关于python的下载安装不再赘述,python的版本号是我们在opencv库的安装过程中需要用到的,cmd运行python可以进行查看. 通常,我们使用pip命令来安装扩展库. 打开cmd运行 pip install opencv-py

  • Python3.7中安装openCV库的方法

    1.首先自己直接在cmd中输入 pip3 install openCV是不可行的,即需要自己下载安装包本地安装 2.openCV库 下载地址http://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv 3.opencv_python‑3.4.2‑cp37‑cp37m‑win_amd64.whl(cp37指的是python的版本,win_amd64是指python是64位的,也有可能有人64位的系统装了32位的python,这时候就需要装win32的版本) 4

  • python读取并显示图片的三种方法(opencv、matplotlib、PIL库)

    前言 在进行图像处理时,经常会用到读取图片并显示出来这样的操作,所以本文总结了python中读取并显示图片的3种方式,分别基于opencv.matplotlib.PIL库实现,并给出了示例代码,介绍如下. OpenCV OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mac OS操作系统上. 它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Ruby.MATLAB等语言的接口

  • Python实现批量修改图片格式和大小的方法【opencv库与PIL库】

    本文实例讲述了Python实现批量修改图片格式和大小的方法.分享给大家供大家参考,具体如下: 第一种方法用到opencv库 import os import time import cv2 def alter(path,object): result = [] s = os.listdir(path) count = 1 for i in s: document = os.path.join(path,i) img = cv2.imread(document) img = cv2.resize(

  • python计算机视觉OpenCV库实现实时摄像头人脸检测示例

    目录 设备准备: 实现过程 调用模型库文件 打开摄像头 人脸检测 设置退出机制 程序运行 全部代码 OpenCV 是一个C++库,目前流行的计算机视觉编程库,用于实时处理计算机视觉方面的问题,它涵盖了很多计算机视觉领域的模块.在Python中常使用OpenCV库实现图像处理. 本文将介绍如何在Python3中使用OpenCV实现实时摄像头人脸检测: 设备准备: USB摄像头 接入PC电脑USB口,并调试正常打开视频.如果电脑内置了电脑摄像头,测试一下摄像头能否正常使用. 下载特征分类模型: XM

  • python环境下安装opencv库的方法

    注意:安装opencv之前需要先安装numpy,matplotlib等 一.安装方法 方法一.在线安装 1.先安装opencv-python pip install opencv-python --user 我的python版本是3.6.8,可以看到opencv安装的默认版本是 opencv_python-4.1.0.25-cp36-cp36m-win_amd64.whl 2.再安装opencv-contrib-python pip install opencv-contrib-python -

  • 巧妙使用python opencv库玩转视频帧率

    目录 需求背景 关于opencv 安装opencv opencv-python获取视频相关信息 需求背景 在很多时候我们需要抽取视频的某一帧做一些分析或修改等:比如笔者需求就是判断一个人在该视频中出现的频率,以判断他是否是这段视频的主角: 关于opencv OpenCV 是 Intel 开源计算机视觉库 (Computer Version) .它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV 拥有包括 300 多个 C 函数的跨平台的中.高

  • Python 第三方opencv库实现图像分割处理

    目录 前言 1.加载图片 2.对图片做灰度处理 3.对图片做二值化处理 3.1.自定义阈值 4.提取轮廓 5.对轮廓画矩形框 6.分割图片并保存 7.查看分割图片 8.完整代码 前言 所需要安装的库有: pip install opencv-python pip install matplotlib Python接口帮助文档网址:https://docs.opencv.org/4.5.2/d6/d00/tutorial_py_root.html 本文所用到的图片素材: 首先,导入所用到的库: i

  • Python基于OpenCV库Adaboost实现人脸识别功能详解

    本文实例讲述了Python基于OpenCV库Adaboost实现人脸识别功能.分享给大家供大家参考,具体如下: 以前用Matlab写神经网络的面部眼镜识别算法,研究算法逻辑,采集大量训练数据,迭代,计算各感知器的系数...相当之麻烦~而现在运用调用pythonOpenCV库Adaboost算法,无需知道算法逻辑,无需进行模型训练,人脸识别变得相当之简单了. 需要用到的库是opencv(open source computer vision),下载安装方式如下: 使用pip install num

  • 如何使用Python的OpenCV库处理图像和视频

    目录 介绍 计算机视觉 OpenCV 应用: 安装 使用 OpenCV 处理图像 1. 从文件中读取图像 2. 调整图像大小: 3. 旋转图像 4. 翻转图像: 5. 重写图像 6. 裁剪图像 7. 绘制形状 使用 OpenCV 处理视频 1. 捕获视频帧的属性: 2. 读取视频文件 3. 编写视频文件 结论 总结 介绍 众所周知,计算机视觉在机器学习和人工智能领域获得了巨大的普及.图像识别技术允许计算机处理比人眼更多的信息,通常更快.更准确,或者只是在人们不参与观看的情况下处理.因此,你可能想

  • 利用Python和OpenCV库将URL转换为OpenCV格式的方法

    今天的博客是直接来源于我自己的个人工具函数库. 过去几个月,有些PyImageSearch读者电邮问我:"如何获取URL指向的图片并将其转换成OpenCV格式(不用将其写入磁盘再读回)".这篇文章我将展示一下怎么实现这个功能. 额外的,我们也会看到如何利用scikit-image从URL下载一幅图像.当然前行之路也会有一个常见的错误,它可能让你跌个跟头. 继续往下阅读,学习如何利用利用Python和OpenCV将URL转换为图像 方法1:OpenCV.NumPy.urllib 第一个方

  • python使用pycharm环境调用opencv库

    我这只学术的小小只白,竟然也开始写博客了.因为配置opencv的库用了很长的时间,三天,遇到很多问题,一个个解决后,才决定分享出来,想要用pythont调用opencv库的少走些弯路.写这篇文章另一方面是收到浅墨--毛星云的博客的影响,浅墨博主,真的是无私的分享了自己的代码,我是一个很懒得人,深受影响,做个不懒惰的人. 首先安装python,有2.X和3.X,两个版本有很大的不同.我用的是2.7,2.系列支持opencv的很多库. Python下载链接: https://www.python.o

  • Window系统下Python如何安装OpenCV库

    关于OpenCV简介 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口. 在计算机视觉项目的开发中,OpenCV作为较大众的开源库,拥有了丰富的常

  • Python中OpenCV实现简单车牌字符切割

    在Jupyter Notebook上使用Python+opencv实现如下简单车牌字符切割.关于opencv库的安装可以参考:Python下opencv库的安装过程与一些问题汇总. 1.实现代码 import cv2 import numpy as np import matplotlib.pyplot as plt from PIL import Image #读取原图片 image1=cv2.imread("123456.jpg") cv2.imshow("image1&

随机推荐