OpenCV(实战)二值图颜色填充(彩色图形、硬币)
目录
一、彩色图形填充
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(实战)二值图颜色填充(彩色图形、硬币)相关推荐
- OpenCV技巧 | 二值图孔洞填充方法与实现(附Python/C++源码)
点击上方"OpenCV与AI深度学习",选择加"星标"或"置顶" 重磅干货,第一时间送达 导读 本文主要介绍使用OpenCV对二值图做孔洞填 ...
- C语言实现将彩色BMP位图转化为二值图
2019独角兽企业重金招聘Python工程师标准>>> CTF做了图片的隐写题,还没有形成系统的认识,先来总结一下BMP图的组成,并通过将彩色图转为二值图的例子加深下理解. 只写了位 ...
- 彩色图、灰度图和二值图
首先计算机中图像是用矩阵存储的,所以在分析图像时,应当用矩阵的眼光来看待 1.RGB模式(百万种颜色) 2.CMYK模式(四种印刷色) 3.索引模式(256种颜色) 4.灰度模式(256级灰度) 5. ...
- 利用OpenCV和C++实现由RGB图像转化为灰度图,再将灰度图转化为二值图的程序
#include<opencv2\opencv.hpp> #include<opencv2/imgproc/imgproc.hpp> #include<opencv2\i ...
- python3 opencv 基于二值化图像素投影的图片切割方法
对于一些背景纯色,结构相对简单的图,可以利用传统的opencv图像处理进行分割.先来记录一下基于二值化图像素投影的图片切割方法的实现.比如下面这张图,可以利用这个算法进行切割.(源代码在最后面) 切割 ...
- opencv:把三通道图转换成灰度图、二值图
#include <opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<openc ...
- Python BFS 提取二值图联通域
<Python BFS 提取二值图联通域> 2016年实习那会儿在京东搞身份证 OCR,那时候的OCR是基于 CNN 的单字识别的pipeline,所以就需要一些方法来对字符进行切割 ...
- c语言实现灰度图转换为二值图
转载自:https://www.cnblogs.com/wd1001/p/4571916.html c语言实现灰度图转换为二值图 将上篇得到的灰度图转换为二值图,读取像素数据,低于某一值置0,否则设置 ...
- 千张照片合成你一张美照-【OpenCV实战二】
如果你手头有很多很多她的照片,想要给她一个惊喜,你一定要知道这篇文章的威力! OpenCV图像处理其中经典的案例就是千图合成技术,通过对于不同图像的特征提取,再拼合成指定的图像.快去给你的她也搞一个吧 ...
最新文章
- 第二次冲刺阶段第四天
- 3分钟入门python_3分钟学完Python,直接从入门到精通「史上最强干货库」
- 第二阶段scrum-3
- 学习笔记-----关于C++中类的成员函数可以访问私有成员的问题
- 计算机技术大神,2017考研:计算机科学与技术学科大神给你的套路
- 【第三期】那些设计漂亮、有创意的电路板!
- WebBrowser控件禁用超链接转向、脚本错误提示、默认右键菜单和快捷键
- java学习(32):巩固练习
- UVA 644 - Immediate Decodability
- 【南邮操作系统实验】银行家算法Java版
- windows下Qt5.4.2 for android开发环境配置
- PHP获取一篇文章内容中的全部图片,并下载
- python消费kafka_Python脚本消费kafka数据
- 迈信ep100交流伺服 含原理图、PCB图、C源代码等生产资 料。
- 人工智能实战第六次作业_张绍恺
- python span()函数_Python正则表达式六种函数实例讲解
- 计算机无法进入桌面怎么备份,系统崩溃无法启动如何从pe进入系统备份C盘和桌面重要文件...
- kaggle机器学习教程(Python实现)
- 服务器硬件基础设施,【通讯技术】细节定成败,NFV中的硬件基础设施管理
- 各种机器学习算法的应用场景分别是什么(比如朴素贝叶斯、决策树、K 近邻、SVM、逻辑回归最大熵模型)?...
热门文章
- Android studio 导入jar 文件
- android sdk安装
- 洛谷P1092 虫食算
- 解剖JavaScript中的null和undefined
- sklearn.model_selection.train_test_split随机划分训练集和测试集
- 有原型的对象和没有原型的对象
- gdoi2017总结
- Docker - Install docker on CentOS
- 百度地图JavaScript API自定义覆盖物、自定义信息窗口增删时的显示问题
- 解决Apache CXF 不支持传递java.sql.Timestamp和java.util.HashMap类型问题