Opencv实战【3】——图像修复与图像锐化(darling in the franxx)

目录

    • 前言
    • 图像修复
    • 图像锐化
    • darling in the franxx图片
    • 总结

前言

前天,在群里看见有人发了这张表情包:
表情包
感觉女主有点好看,然后问室友是啥番剧(darling in the franxx),然后就去补番了,然后从晚上十二点看到早上五点多,睡了一觉下午接着看,看完脑子里面全是02,啊啊啊啊,这种番这的太对我的胃口了,墙裂推荐!!!
在网站上截了几张图准备做壁纸的,但是这几张图片有几个缺点:
1、有两张手速不快,截图上有字
2、由于图像经过处理有点模糊,细节不够明显
于是查了查Opencv有没有相关的函数可以解决这种问题,发现是有的。
上述的两种问题分别对应着两种图像处理效果:1、图像修复 2、图像锐化

图像修复

图像修复,指对受到损坏的图像进行修复重建或者去除图像中的多余物体。
去除文字,是图像修复的一种应用。
Opencv自带inpaint函数:

CV_EXPORTS_W void inpaint( InputArray src, InputArray inpaintMask,OutputArray dst, double inpaintRadius, int flags );

其中
InputArray src 表示要修复的图像,
InputArray inpaintMask表示修复模板,
OutputArray dst 表示修复后的图像,
double inpaintRadius 表示修复的半径,
int flags 表示修复使用的算法 。 opencv提供了两种选择 CV_INPAINT_TELEA 和 CV_INPAINT_NS。
这里不详细讲解修复原理,百度或知乎都有相关的原理讲解的。

调用inpaint()函数一个关键的点:确定修复掩膜。
修复掩膜只能为8位单通道的图像,其中非零像素表示需要修补的区域。
所以,用阈值法提取的文字图像作为修复掩膜。虽然阈值法的处理结果可能会导致一些误检点或者误检区域,但这些误检都在可容忍的错误范围之内。而且可用形态学方法中膨胀操作对阈值法提取的结果进行膨胀,膨胀操作的结果再作为修复掩膜。

代码:
1、确定修复掩膜图像,观察像素发现,文字为白色

Mat GetRedComponet(Mat srcImg)
{//如果直接对srcImg处理会改变main()函数中的实参Mat dstImg = srcImg.clone();Mat_<Vec3b>::iterator it = dstImg.begin<Vec3b>();Mat_<Vec3b>::iterator itend = dstImg.end<Vec3b>();for (; it != itend; it++){if ((*it)[2] > 230 && (*it)[1] > 230 && (*it)[2] > 230){(*it)[0] = 255;(*it)[1] = 255;(*it)[2] = 255;//红色分量保持不变}else{(*it)[0] = 0;(*it)[1] = 0;(*it)[2] = 0;}}return dstImg;
}

2、确定膨胀参数以及修复半径

void Inpainting(Mat oriImg, Mat maskImg,Mat& inpaintedImage)
{Mat grayMaskImg;Mat element = getStructuringElement(MORPH_ELLIPSE, Size(15, 15));//MORPH_RECT MORPH_CROSS;MORPH_ELLIPSE;dilate(maskImg, maskImg, element);//膨胀后结果作为修复掩膜//将彩色图转换为单通道灰度图,最后一个参数为通道数cvtColor(maskImg, grayMaskImg, COLOR_BGR2GRAY, 1);//修复图像的掩膜必须为8位单通道图像inpaintedImage.create(oriImg.size(), oriImg.type());inpaint(oriImg, grayMaskImg, inpaintedImage, 3, INPAINT_NS);     //INPAINT_NS   INPAINT_TELEA
}

3、传入图片,展示图片

int main(int argc, char* argv[])
{Mat srcImg;srcImg=imread("D:\\opencv_picture_test\\darling in the franxx\\02字.png", 1);//获取掩膜大概区域,之后需要进行膨胀处理,扩大掩膜区域Mat imgComponet = GetRedComponet(srcImg);Mat inpaintedImage;Mat result;//修复Inpainting(srcImg, imgComponet, inpaintedImage);//namedWindow("原图", WINDOW_NORMAL);   //imshow("原图", srcImg);namedWindow("图像复原结果图", WINDOW_NORMAL);imshow("图像复原结果图", inpaintedImage);waitKey(0);return 0;
}

效果:
原图:
原图
复原结果
感觉效果还行,不过效果没有达到做壁纸的效果,唉。。。

图像锐化

图像锐化,是使图像边缘更清晰的一种图像处理方法,细节增强(detail enhancement)。
常用的做法是提取图像的高频分量,将其叠加到原图上。
图像高频分量的提取有两种做法,一种是用高通滤波器,得到高频分量,另一种是通过低通滤波,用原图减低频得以高频。
直接提取高频的方法有sobel算法、laplcian算子,sobel算子是图像的一阶导数,提取的是梯度信息,分水平和垂直两种,常常用来做边缘检测、方向判别,sobel算子在斜坡处不为0,因此会产生较粗的边缘。laplcian算子是图像的二阶导,在图像开始变化和结束变化的地方值不为0,渐变时结果为0,因此laplacian比sobel算子更适合做sharpen。
除了直接提取高频的方法外,我们也可以先提取低频,原图减去低频得到高频。这种方法称为非锐化掩模(unsharpen
mask),我们常使用低通滤波器(高斯、双边)对图像进行滤波,这种方法滤波器很好控制(包括大小和强弱),从而可以控制高频分量的强弱。

高频分量提取(滤波)

void sharpenImage( cv::Mat& image, cv::Mat& result)
{//创建并初始化滤波模板,这里使用拉普拉斯模板cv::Mat kernel(3, 3, CV_32F, cv::Scalar(0));kernel.at<float>(1, 1) = 5.0;kernel.at<float>(0, 1) = -1.0;kernel.at<float>(1, 0) = -1.0;kernel.at<float>(1, 2) = -1.0;kernel.at<float>(2, 1) = -1.0;result.create(image.size(), image.type());//对图像进行滤波cv::filter2D(image, result, image.depth(), kernel);
}

效果:
效果

darling in the franxx图片

锐化:
02
海滩
夕阳
修复:
莓
02
轮廓或边缘:
轮廓
边缘

总结

莓的那张由于字在树林背景那边,看起来效果还行。02的那张由于涉及到身体轮廓,以后还需要进行改进。
另外以后手速还是需要练,尽量截到不带字的图。
大爱02小宝贝!!!

Reference:

https://www.cnblogs.com/hellowooorld/p/7048614.html
https://blog.csdn.net/zx249388847/article/details/79325385/
https://blog.csdn.net/helimin12345/article/details/82634355
https://blog.csdn.net/hankerbit/article/details/80838241

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378535.shtml

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

相关文章

python 示例_Python date isoweekday()方法与示例

python 示例Python date.isoweekday()方法 (Python date.isoweekday() Method) date.isoweekday() method is used to manipulate objects of date class of module datetime. date.isoweekday()方法用于处理模块日期时间的日期类的对象。 It uses a date class object and r…

07-机器学习(Hog+SVM实现小狮子识别)

一、SVM支持向量机 什么是SVM支持向量机&#xff1f; SVM支持向量机本质仍是一个分类器&#xff0c;其核心为寻求一个最优超平面最终实现分类&#xff0c;实现分类问题 在寻求超平面的时候有多种方式&#xff0c;可以使用若干条直线或曲线进行分类&#xff0c;这里使用的是直线…

Net Remoting基础篇

一、Remoting基础 什么是Remoting&#xff0c;简而言之&#xff0c;我们可以将其看作是一种分布式处理方式。从微软的产品角度来看&#xff0c;可以说Remoting就是DCOM的一种升 级&#xff0c;它改善了很多功能&#xff0c;并极好的融合到.Net平台下。Microsoft .NET Remoting …

Maven3.0.5代理nexus

Nexus简介 Nexus是Sonatype推出的强大Maven仓库管理器产品&#xff0c;要比以前TSS上介绍的Artifactory要好使用的多&#xff0c;也是一个拆箱即用的Java App&#xff0c;内嵌Jetty容器和Java Wrapper做Windows服务&#xff0c;安装简单到解压然后双击install即可。更详细的帮助…

8253译码电路设计以及初始化编程讲解

先验知识回顾&#xff1a;知识点不清晰的时候可以查询相关知识点。 https://blog.csdn.net/qq_42604176/article/details/105810973 需掌握的主要知识点 1、译码电路设计 2、初始化编程 例题1 在以 8086构成的最大方式系统中&#xff0c;有一片8254的端口地址分别为301H、3…

java安卓写文件路径,如何使用gradle作为构建系统,平台Android配置Protobuf(Java)文件的输出路径?...

我正在努力解决以下问题&#xff1a;我有2个基于maven的java项目和1个基于gradle的Android项目 . 布局如下&#xff1a;Workspace/├── MavenProj1/├── MavenProj2/├── AndroidGradleProject1/├── Protos/所有这些的包结构很常见&#xff0c;比方说 com.example.* 所…

Java System类exit()方法及示例

系统类exit()方法 (System class exit() method) exit() method is available in java.lang package. exit()方法在java.lang包中可用。 exit() method is used to exit the currently running JVM (Java Virtual Machine). exit()方法用于退出当前正在运行的JVM(Java虚拟机)。…

基于图像处理的数码印花喷墨墨滴形状规范的研究(Python+OpenCV+Mysql)

大体思路&#xff1a;由于墨滴的不同参数会对墨滴的形态产生一定的影响&#xff0c;故如果通过研究墨滴的形态则通过海量的数据就可以大概确定墨滴的各项参数指标的范围。通过OpenCV对墨滴的喷出的形状进行图像处理&#xff0c;对墨滴图像进行一系列的分析&#xff0c;通过一系…

ASP.NET 主题(Themes)FAQ

1、主题是什么 主题由一组元素组成&#xff1a;外观、级联样式表 (CSS)、图像和其他资源。主题将至少包含外观。主题是在网站或 Web 服务器上的特殊目录中定义的。主题是一组Web Control的属性设置的集合&#xff0c;提供一种简单的方法设置控件的样式属性。 主题只在Web Contr…

Head First HTML与CSS、XHTML++笔记(第四章 WEB镇之旅 第五章 认识媒体)

第四章 链接&#xff08;详解<a>元素&#xff09; 目标锚 在目标位置 <h2><a id"chai">contentTest</a></h2> 在需要链接位置 <a href"index.html#chai">See</a> 链接到自身的目标锚 <a href"#top"…

Opencv实战【4】——图片动漫化处理

博主联系方式&#xff1a; QQ:1540984562 微信&#xff1a;wxid_nz49532kbh9u22 QQ交流群&#xff1a;750313950 目录动漫化风格的特点处理手段代码实现效果总结动漫化风格的特点 &#xff08;1&#xff09;动漫中的细节相对少&#xff1b; &#xff08;2&#xff09;动漫中的边…

nextshort_Java扫描仪的nextShort()方法与示例

nextshort扫描器类的nextShort()方法 (Scanner Class nextShort() method) Syntax: 句法&#xff1a; public short nextShort();public short nextShort(int rad);nextShort() method is available in java.util package. nextShort()方法在java.util包中可用。 nextShort() …

php 生成css文件怎么打开,php生成html文件的多种步骤介绍

//定义日期函数functiongetdatetime(){$datetimegetdate();$strReturn$datetime["year"]."-";$strReturn$strReturn.$datetime["mon"]."-";$strReturn$strReturn.$datetime["mday"];return$strReturn;}//定义时间函数(文件名…

08-KNN手写数字识别

标签下载地址 文件内容备注train-images-idx3-ubyte.gz训练集图片&#xff1a;55000张训练图片&#xff0c;5000张验证图片train-labels-idx1-ubyte.gz训练集图片对应的数字标签t10k-images-idx3-ubyte.gz测试集图片&#xff1a;10000张图片t表示test&#xff0c;测试图片&…

MFC odbc访问远程数据库

首先&#xff0c;MFC通过ODBC访问数据库&#xff0c;主要使用两个类&#xff0c;一个是CDataBase&#xff0c;一个是CRecordset。第一个是用于建立数据库连接的&#xff0c;第二个是数据集&#xff0c;用来查询的。步骤如下&#xff1a;1.实例化一个CDataBase对象&#xff0c;并…

微机原理——扩展存储器设计

目录【1】存储器的层次结构【2】存储器的分类【3】SRAM1、基本原理&#xff1a;2、结构&#xff1a;3、芯片参数与引脚解读&#xff1a;4、CPU与SRAM的连接方式【4】DRAM1、基本原理&#xff1a;2、结构3、芯片引脚解读&#xff1a;【5】存储器系统设计【6】存储器扩展设计&…

floatvalue 重写_Java Number floatValue()方法与示例

floatvalue 重写Number类floatValue()方法 (Number Class floatValue() method) floatValue() method is available in java.lang package. floatValue()方法在java.lang包中可用。 floatValue() method is used to return the value denoted by this Number object converted …

array_column php什么版本可以用,array_column兼容php5.5以下版本

gistfile1.txt// ----------------------------------------------------------------------// |获取二维数组中指定的一列&#xff0c;PHP5.5以后有专用函数array_column()// ----------------------------------------------------------------------// |param array $arr// …

。net学习之控件的使用注意点

jQuery使用 1、自定义属性的使用<script>$(#xwjj_i_main br[brinfoPd_KangQiao_Subject_Xwjj_br_1]).hide();</script> 2、ready代码块$(document).ready(function(){ //你的代码}); 3、简单的特效hide&#xff08;&#xff09;$("a").click(function()…

09-CNN手写数字识别

CNN卷积神经网络的本质就是卷积运算 维度的调整&#xff1a; tf.reshape(imageInput,[-1,28,28,1]) imageInput为[None,784]&#xff0c;N行* 784维 调整为 M28行28列*1通道 即&#xff1a;二维转化为四维数据 参数一&#xff1a;等价于运算结果M 参数二&#xff1a;28 28 表示…