目录

一、彩色图形填充

1、初始效果展示

2、试错过程:

1、试错1:锐化显示所有图片

2、试错2:用礼帽提取出明亮部分

3、正确方式:直接对图片亮度增强(不用形态学处理)

总代码

二、硬币填充

1、初始效果展示

2、试错

1、如果对它进行亮度增强

2、对它进行亮度减小

3、分析原图

4、黑帽处理

1、椭圆形卷积核

2、矩形卷积核

5、设置合适的阈值,得到二值图

1、127阈值

2、30阈值

总代码


一、彩色图形填充

1、初始效果展示

# 转二值图
def ToBinary():global gray, binary# 1、灰度图gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)cv.imshow('imgray', gray)# 2、二进制图像ret, binary = cv.threshold(gray, 127, 255, 0)cv.imshow('binary', binary)

可以发现有些图形明显颜色不达标,甚至根本就没有显示。我们需要把所有图片轮廓锐化。

2、试错过程:

1、试错1:锐化显示所有图片

在灰度化之前,先进行锐化:

# 1、锐化kernel = np.array([[4, 4, 4],[4, -32, 4],[4, 4, 4]])sharp = cv.filter2D(img, -1, kernel)cv.imshow('sharp', sharp)

图像处理被锐化的同时,噪声也被锐化,不可取。

2、试错2:用礼帽提取出明亮部分

# 礼帽tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, (3,3), iterations=10)cv.imshow('tophat', tophat)

礼帽(顶帽)处理效果如下:

可以看出,还是没有达到预期的效果。

同时,发现顶帽和底帽(礼帽和黑帽)确实名副其实,在这里,一个提取顶,一个提取底。(^_^)看看黑帽(底帽)效果吧:

3、正确方式:直接对图片亮度增强(不用形态学处理)

 直接增强图片的亮度

# 1、亮度增强bright = cv.convertScaleAbs(img, None, 1.5, 30)cv.imshow('bright', bright)

很好,达到了想要的效果。

所以有的时候思维不要局限,有时候简单的方法反而能更好的达到目标

总代码

# 二值图内部填充
import cv2 as cv
import numpy as np# 转二值图
def ToBinary():global gray, binary# 1、亮度增强bright = cv.convertScaleAbs(img, None, 1.5, 30)cv.imshow('bright', bright)# 2、灰度化gray = cv.cvtColor(bright, cv.COLOR_BGR2GRAY)cv.imshow('gray', gray)# 3、二进制图像ret, binary = cv.threshold(gray, 127, 255, 0)cv.imshow('binary', binary)if __name__ == '__main__':img = cv.imread('Resource/test7.jpg')cv.imshow('img', img)ToBinary()      #转二进制图像cv.waitKey(0)

二、硬币填充

1、初始效果展示

硬币直接转二值图效果:

可以看出:

1、右边的圈圈还是有一些瑕疵;

2、左边残留部分黑色区域。

2、试错

1、如果对它进行亮度增强

可以看出来,亮度增强明显是行不通的。

2、对它进行亮度减小

虽然能够填补空缺,但是它也被背景的黑色侵蚀的差不多了。

3、分析原图

感觉这张图像缺的不是亮度,个人感觉是暗度不均匀,因为右边图像出了问题,它和其他图像最大的区别就是过亮了。我们需要对其暗化。除了亮度变化,还有形态学能控制亮度:礼帽/黑帽

4、黑帽处理

为了得到较暗的区域,我们需要对它进行黑帽处理。这里用矩形卷积核效果最好。

但默认是椭圆形,所以需要修改一下:

# 设置卷积核:矩形(默认椭圆形)kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, (31, 31))

卷积核默认椭圆形

# 2、黑帽kernel = cv.getStructuringElement(cv.MORPH_RECT, (31, 31))blackhat = cv.morphologyEx(gray, cv.MORPH_BLACKHAT, kernel, iterations=1)cv.imshow('blackhat', blackhat)

一开始不知道,就是设置的默认椭圆形,改来改去没效果

对比一下效果:

1、椭圆形卷积核

blackhat = cv.morphologyEx(gray, cv.MORPH_BLACKHAT, (31,31), iterations=1)

2、矩形卷积核

# 设置卷积核:矩形(默认椭圆形)kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, (31, 31))blackhat = cv.morphologyEx(gray, cv.MORPH_BLACKHAT, kernel, iterations=1)

5、设置合适的阈值,得到二值图

# 3、得到二进制图像(要设置好合适的阈值)ret, binary = cv.threshold(blackhat, 30, 255, 0)cv.imshow('binary', binary)

别思维固化了,二值图的阈值不一定必须得是127,为了得到目标,可以设置为其它阈值。(比如这里设置为30最佳)

对比一下效果:

1、127阈值

可以看到,什么都没有

2、30阈值

总代码

# 二值图内部填充(图形和硬币)
import cv2 as cv
import numpy as np# 转二值图(图形)
def Figure_ToBinary():img = cv.imread('Resource/test7.jpg')cv.imshow('img', img)# 1、亮度增强bright = cv.convertScaleAbs(img, None, 1.5, 30)cv.imshow('bright', bright)# 2、灰度化gray = cv.cvtColor(bright, cv.COLOR_BGR2GRAY)cv.imshow('gray', gray)# 3、二进制图像ret, binary = cv.threshold(gray, 127, 255, 0)cv.imshow('binary', binary)#转二值图像(硬币)
def Coin_ToBinary():img = cv.imread('Resource/test9.jpg')cv.imshow('img', img)# 1、灰度化gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)cv.imshow('gray', gray)# 2、黑帽# 设置卷积核:矩形(默认椭圆形)kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, (31, 31))blackhat = cv.morphologyEx(gray, cv.MORPH_BLACKHAT, kernel, iterations=1)cv.imshow('blackhat', blackhat)# 3、得到二进制图像(要设置好合适的阈值)ret, binary = cv.threshold(blackhat, 30, 255, 0)cv.imshow('binary', binary)if __name__ == '__main__':Figure_ToBinary()      #转二值图像(图形)Coin_ToBinary()        #转二值图像(硬币)cv.waitKey(0)

OpenCV(实战)二值图颜色填充(彩色图形、硬币)相关推荐

  1. OpenCV技巧 | 二值图孔洞填充方法与实现(附Python/C++源码)

    点击上方"OpenCV与AI深度学习",选择加"星标"或"置顶" 重磅干货,第一时间送达 导读 本文主要介绍使用OpenCV对二值图做孔洞填 ...

  2. C语言实现将彩色BMP位图转化为二值图

    2019独角兽企业重金招聘Python工程师标准>>> CTF做了图片的隐写题,还没有形成系统的认识,先来总结一下BMP图的组成,并通过将彩色图转为二值图的例子加深下理解. 只写了位 ...

  3. 彩色图、灰度图和二值图

    首先计算机中图像是用矩阵存储的,所以在分析图像时,应当用矩阵的眼光来看待 1.RGB模式(百万种颜色) 2.CMYK模式(四种印刷色) 3.索引模式(256种颜色) 4.灰度模式(256级灰度) 5. ...

  4. 利用OpenCV和C++实现由RGB图像转化为灰度图,再将灰度图转化为二值图的程序

    #include<opencv2\opencv.hpp> #include<opencv2/imgproc/imgproc.hpp> #include<opencv2\i ...

  5. python3 opencv 基于二值化图像素投影的图片切割方法

    对于一些背景纯色,结构相对简单的图,可以利用传统的opencv图像处理进行分割.先来记录一下基于二值化图像素投影的图片切割方法的实现.比如下面这张图,可以利用这个算法进行切割.(源代码在最后面) 切割 ...

  6. opencv:把三通道图转换成灰度图、二值图

    #include <opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<openc ...

  7. Python BFS 提取二值图联通域

    <Python BFS 提取二值图联通域>    2016年实习那会儿在京东搞身份证 OCR,那时候的OCR是基于 CNN 的单字识别的pipeline,所以就需要一些方法来对字符进行切割 ...

  8. c语言实现灰度图转换为二值图

    转载自:https://www.cnblogs.com/wd1001/p/4571916.html c语言实现灰度图转换为二值图 将上篇得到的灰度图转换为二值图,读取像素数据,低于某一值置0,否则设置 ...

  9. 千张照片合成你一张美照-【OpenCV实战二】

    如果你手头有很多很多她的照片,想要给她一个惊喜,你一定要知道这篇文章的威力! OpenCV图像处理其中经典的案例就是千图合成技术,通过对于不同图像的特征提取,再拼合成指定的图像.快去给你的她也搞一个吧 ...

最新文章

  1. 第二次冲刺阶段第四天
  2. 3分钟入门python_3分钟学完Python,直接从入门到精通「史上最强干货库」
  3. 第二阶段scrum-3
  4. 学习笔记-----关于C++中类的成员函数可以访问私有成员的问题
  5. 计算机技术大神,2017考研:计算机科学与技术学科大神给你的套路
  6. 【第三期】那些设计漂亮、有创意的电路板!
  7. WebBrowser控件禁用超链接转向、脚本错误提示、默认右键菜单和快捷键
  8. java学习(32):巩固练习
  9. UVA 644 - Immediate Decodability
  10. 【南邮操作系统实验】银行家算法Java版
  11. windows下Qt5.4.2 for android开发环境配置
  12. PHP获取一篇文章内容中的全部图片,并下载
  13. python消费kafka_Python脚本消费kafka数据
  14. 迈信ep100交流伺服 含原理图、PCB图、C源代码等生产资 料。
  15. 人工智能实战第六次作业_张绍恺
  16. python span()函数_Python正则表达式六种函数实例讲解
  17. 计算机无法进入桌面怎么备份,系统崩溃无法启动如何从pe进入系统备份C盘和桌面重要文件...
  18. kaggle机器学习教程(Python实现)
  19. 服务器硬件基础设施,【通讯技术】细节定成败,NFV中的硬件基础设施管理
  20. 各种机器学习算法的应用场景分别是什么(比如朴素贝叶斯、决策树、K 近邻、SVM、逻辑回归最大熵模型)?...

热门文章

  1. Android studio 导入jar 文件
  2. android sdk安装
  3. 洛谷P1092 虫食算
  4. 解剖JavaScript中的null和undefined
  5. sklearn.model_selection.train_test_split随机划分训练集和测试集
  6. 有原型的对象和没有原型的对象
  7. gdoi2017总结
  8. Docker - Install docker on CentOS
  9. 百度地图JavaScript API自定义覆盖物、自定义信息窗口增删时的显示问题
  10. 解决Apache CXF 不支持传递java.sql.Timestamp和java.util.HashMap类型问题