最简单的方法就是对比度拉伸(Contrast Stretching)。 ? 现在有这样的一个低对比度的图片,其灰度直方图集中在中间的区域。 然后我们想把这个灰度直方图拉伸到整个0~255的区间,我们怎么做呢?(这里假设这个低对比度的图片的灰度集中在100到200之间好了) ? ~200范围线性拉伸到0~255这么大。 这种方法最简单,简单的说就是线性拉伸直方图。对于某些图片可以起到效果: ? 但是对于比较复杂的图片,并没有什么效果: ? 这个图中,直观的展示了,任何一个直方图,只要按照该直方图的累积分布函数进行拉伸,就可以得到一个矩形的直方图。 下面是一个利用这样的方法增强对比度的例子: ?
OpenCV实现 2. 原理 1) 概率密度函数 2) 概率分布函数 3) 原理应用 4) 原理推导 3. 具体实现 4. 参考文献 1. OpenCV实现 在OpenCV中,实现直方图均衡化比较简单,调用equalizeHist函数即可。 1) 概率密度函数 具体到一张图像上来说,可以把图像的灰度(像素值)ri看作是随机变量,则可以知道图像灰度的概率为: 对应的,对于一个连续型的随机变量x,如果存在函数f(x)也满足上面两个条件 具体实现 根据第二节的论述,就知道直方图均衡化的具体操作了,可以分成以下几步: 读取源图像,统计源图像的直方图。 归一化直方图,统计源图像每个像素的概率密度值和概率分布值。 将每个像素的概率分布值恢复到 0 到 255 的区间,作为目标图像的像素。 写出目标图像。
一键领取预热专享618元代金券,2核2G云服务器爆品秒杀低至18元!云产品首单低0.8折起,企业用户购买域名1元起…
参考链接: 使用OpenCV在Python中进行图像处理 在上一篇中记录了,如何配置opencv环境的问题。本篇则记录对灰度图像进行一些常规处理。 一张图片是由像素点矩阵构成,我们对图片进行操作即为对图片的像素点矩阵进行操作。 图片的灰度化:将一个像素点的三个颜色变量相等,R=G=B,此时该值称为灰度值 直接调用opencv中的函数,读入的图片可以与代码文件放在一起这样可以省略输入图片路径。 在灰度图像中像素值在0~255,二值化后图像中像素值为0或255。 伽马值小于1时,会拉伸图像中灰度级较低的区域,同时会压缩灰度级较高的部分 伽马值大于1时,会拉伸图像中灰度级较高的区域,同时会压缩灰度级较低的部分 4.对灰度图像进行对数变换 # 对数变换 logc =
OpenCV的Sobel函数原型为: Sobel(src,ddepth,dx,dy[,dst[,ksize[,scale[,delta[,borderType]]]]]) src参数表示输入需要处理的图像 dst参数表示输出与src相同大小和相同通道数的图像。 ksize参数表示Sobel算子的大小,必须为1、3、5、7。 scale参数表示缩放导数的比例常数,默认情况下没有伸缩系数。 3:拉普拉斯算子 代码如下: ? OpenCV的Laplacian函数原型为: Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]]) src参数表示输入需要处理的图像 scale参数表示计算拉普拉斯算子值的比例因子,默认情况下没有伸缩系数。 delta参数表示一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中。
OpenCV是一个C++库,目前流行的计算机视觉编程库,用于实时处理计算机视觉方面的问题,它涵盖了很多计算机视觉领域的模块。在Python中常使用OpenCV库实现图像处理。 OpenCV版本: OpenCV4.1 ? 知识准备 一张图片是由像素点矩阵构成,我们对图片进行操作即为对图片的像素点矩阵进行操作。我们只要在这个像素点矩阵中找到这个像素点的位置,比如第x行,第y列。 No.2 二值化处理 Opencv中的图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。 伽马值小于1时,会拉伸图像中灰度级较低的区域,同时会压缩灰度级较高的部分 伽马值大于1时,会拉伸图像中灰度级较高的区域,同时会压缩灰度级较低的部分 import cv2 import copy #读入原始图像 No.5 灰度图像的反色变换 Opencv中的反色变换:对原图像像素值的颜色进行反转,即黑色变为白色,白色变为黑色。
一张图片如果放大的话一般情况下会失真,如果该图片是规则的,比如这个聊天气泡 ,可以用如下代码来设置 UIImage *rightImg = [UIImage imageNamed:@"SenderTextNodeBkg.png "]; //设置图片拉伸 rightImg = [rightImg stretchableImageWithLeftCapWidth:30 topCapHeight:35]; 在stretchableImageWithLeftCapWidth:30 topCapHeight:35方法中,第一个参数是指取图片从左边数第三十列像素,第二个则是从顶部数第35行像素,在图片需要扩展的时候就会用这两列像素填充 ,因此图片不会失真
canvas在和jq.width()设置宽高的时候会出现拉伸情况。 产生拉伸的方式 能产生拉伸的还有行间style样式也会产生变形拉伸 canvas.style.width = "1000px";也会产生变形 百分比也会产生变形 不会拉伸的方式 直接写width,height document.getElementById('source'); ctx.drawImage(imgPath, 0, 0, 445, 790, 0, 0, 445, 790) //这样的canvas会出现拉伸情况
二、对比度拉伸 代码参考 import cv2 import imutils import numpy as np # image = cv2.imread('E:/city.PNG') image = cv2.imread('E:/city.PNG') gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 在灰度图进行分段线性对比度拉伸 # 变为灰度图像 ? 灰度图像对比度拉伸后结果图 ? 灰度处理后的图像 ? OpenCV库提供的blur函数实现均值滤波后的图像 ? 自己编写均值滤波函数实现的均值滤波图像 ? 椒盐噪声图像 ? OpenCV库自带函数实现中值滤波 ? 中值滤波图像 ? 最大值滤波器图像 ? 最小值滤波器图像 ?
直方图定义 图像直方图由于其计算代价较小,且具有图像平移、旋转、缩放不变性等众多优点,广泛地应用于图像处理的各个领域,特别是灰度图像的阈值分割、基于颜色的图像检索以及图像分类。 如果一副图像的像素占有很多的灰度级而且分布均匀,那么这样的图像往往有高对比度和多变的灰度色调。直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。 直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。 通过上一篇《C++ OpenCV图像的重映射》我们用到了remap这个函数,可以将图像灰度分布从一个分布映射到另一个分布,然后再得到映射后的像素值即可。 ? 代码演示 新建一个项目opencv-0020,配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include和main方法 ? ? 直方图均衡化 代码非常简单 ?
---- 在此之前,先划分三类人,如果不认清自己是什么角色(垃圾)就去玩NDK,你会很糟心: user : 纯粹.so链接库使用者(伸手党) creator : 纯粹ndk开发者,创作.so链接库( ---- 一、对于纯粹.so使用者(User) 1.目录结构 当你只是单纯的使用动态链接库.so中的已有功能,也就是传说中的伸手党。 ,详见:OpenCV专题1 - AndroidStudio的JNI工程及引用OpenCV) ? lib_opencv jnigraphics log ) ---- 你可以定义一个JNI接口来暴露你在C++层实现的方法,再打包成.so供他人使用 这便是开源的魅力,比如下面的灰色图像 Mat dstMat; bitmap2Mat(env, bitmap, &srcMat); cvtColor(srcMat, dstMat, CV_BGR2GRAY);//将图片的像素信息灰度化盛放在
首先介绍术语空间域:指在图像平面本身,对图像每个像素直接进行计算处理。灰度变换也称亮度变换,顾名思义,该处理改变图像的亮度,一般与图像增强操作相关,灰度变换可以改变图像的质量和亮度的对比度。 通过改变这k和b两个变量的值,来调整图像变换的结果。但是,有时候可能并不想将整个图像的灰度值采用相同的直线方程进行变换,这时候,可以对图像进行分段,进行分段线性变换。 采用等例线性灰度变换对图像每一个像素做线性灰度拉伸,将有效地改善图像效果。 图像反转的实现是比较简单的,在OpenCV中有对Mat的运算符重载,可以直接Mat r = 255 - img或者~img来实现。 取反后(鹰眼) 分段线性变换: 分为:对比拉伸、灰度切割、位图切割 ?
对于电脑来说,一切都是数据,图片也不例外。 图片在计算机的眼中,就是一个数字矩阵。 在之前的python opencv-有点意思同学讨论问题记录文章中,有讲过如何对图片进行裁剪和数据修改,主要是对矩阵进行操作。 而图像处理也经常会对图像进行变换操作,常见的有拉伸,缩放,扭曲,旋转,镜像等等。 要实现对应的变换操作,很多图像库都有对应的方法,那如果不用现成的方法,自己来实现一个可以吗? 肯定是可以的。 今天我们先看看旋转,镜像和翻转,下面是对应的效果。 原图 镜像 顺时针旋转90度 上下翻转 下面有一个矩3*3的矩阵(你也可以看做二维列表)。 [[7 4 1] [8 5 2] [9 6 3]] 问题2:对矩阵进行镜像操作 [[3 2 1] [6 5 4] [9 8 7]] 问题3:上下翻转操作。
因此,您需要将这个直方图拉伸到两端(如下图所示,来自wikipedia),这就是直方图均衡化的作用(简单来说)。这通常会提高图像的对比度。 ? 例如,在人脸识别中,在对人脸数据进行训练之前,对人脸图像进行直方图均衡化处理,使其具有相同的光照条件。 OpenCV中的直方图均衡 OpenCV具有执行此操作的功能cv.equalizeHist()。 在这种情况下,图像被分成称为“tiles”的小块(在OpenCV中,tileSize默认为8x8)。然后,像往常一样对这些块中的每一个进行直方图均衡。 如果任何直方图bin超出指定的对比度限制(在OpenCV中默认为40),则在应用直方图均衡之前,将这些像素裁剪并均匀地分布到其他bin。均衡后,要消除图块边界中的伪影,请应用双线性插值。 http://stackoverflow.com/questions/10549245/how-can-i-adjust-contrast-in-opencv-in-c 2.如何使用opencv均衡图像的对比度和亮度
本篇主要内容如下: 1)获取数据:可通过手机/电脑等拍摄自己的头像,也可通过网站下载已收集好的人脸数据集; 2)检测人脸:利用dlib、opencv对人脸进行检测; 3)训练模型:根据检测后的图片 简单解释一下每一步的过程: 图像获取:可以通过摄像镜把人脸图像采集下来或图片上传等方式。 人脸检测:给定任意一张图片,找到其中是否存在一个或多个人脸,并返回图片中 每个人脸的位置、范围及特征等。 预处理:基于人脸检测结果,对图像进行处理,为后续的特征提取服务。系统获取到的人脸图像可能受到各种条件的限制或影响,需要对进行大小缩放、旋转、拉伸、灰度变换规范化及过滤等图像预处理。 特征提取:就是将人脸图像信息数字化,把人脸图像转换为一串数字。 变量),程序中使用的是dlib来识别人脸部分,也可以使用opencv来识别人脸,在实际使用过程中,dlib的识别效果比opencv的好,但opencv识别的速度会快很多,获取10000张人脸照片的情况下
我们只有单个数据点经过网络(“单个数据点”在这里代表着N帧图像经过网络只为了获得单个类别)。 3:输入帧图像的通道数。 16: 每一个blob中帧图像的总数量。 112(第一个):帧图像的高度。 利用这个标签,我们可以抽取出帧图像列表中每个帧图像的预测结果(69-73行),显示输出帧图像,直到按下q键时就打破循环并退出。 如果我们给每一帧单独分类的话,那我们执行脚步的时间就会被拉长。 这说明,通过deque数据结构来进行移动帧图像预测可以获得更好的结果,因为它不会放弃前面全部的帧图像——移动帧图像预测只会丢弃列表中最早进入的帧图像,为那新到的帧图像腾出空间。 请注意我们的模型在识别时对预测是“瑜伽”还是“拉伸腿部”犹豫不决——当你在做下犬式姿势时,这两个动作术语从技术层面来看都是正确的。从定义上来讲,你在做瑜伽的同时,也是在拉伸腿部。
导读 本文给大家分享一个基于OpenCV实现简单人脸面具、眼镜、胡须、鼻子特效的实例,并附实现步骤和源码。 背景介绍 OpenCV传统人脸检测是使用Haar特征的级联分类器实现的。 下图展示了它们是如何组合在一起的。 Haar级联的另一个重要部分是Haar特征,这些特征简单地总结了不同的长方形区域的区别,如下图所示: 计算ABCD区域的Haar特征,只需要计算这个区域白色像素和有色像素的区别。 在上面四张图表中使用了不同的图案创建Haar 特征,同时其他图案也被使用了。这些图案使用了多重尺度法以确保系统的拉伸是不变的。多重尺度法指把图像缩小再次计算同样的特征。 OpenCV安装目录中提供了多个已经训练好的Haar分类器模型文件,包含:人脸检测、人眼检测、鼻子检测和身体检测等,如下图所示: 比如使用haarcascade_frontalface_alt.xml
下面描述的整个过程的图[输入、人脸检测过程&输出] 输入: 该算法需要两个输入: 输入图像矩阵(我们将读取图像并将其转换为数字矩阵/numpy 数组) 面部特征(在haarcascade_frontalface_default.xml 在这种方法中,一个窗口(默认大小为 20 x 20 像素)在图像上滑动(逐行)以查找面部特征。每次迭代后,图像都会按特定因子(由参数“ scaleFactor ”确定)按比例缩小(调整大小)。 这种缩小和窗口化过程一直持续到图像对于滑动窗口来说太小为止,scaleFactor 的值越小,精度越高。 输出: 我们的输出图像将在每个检测到的人脸周围包含一个矩形。 我们首先加载我们的 xml 分类器和输入图像文件。由于输入文件非常大,我们需要调整大小,尺寸与原始分辨率相似,以免它们出现拉伸。然后,我们将图像转换为灰度图像,因为灰度图像被认为可以提高算法的效率。 它采用以下参数: scaleFactor :此参数指定图像缩小的因子,例如:如果此值为 1.05,则图像缩小 5%;如果此值为 1.10,则图像按比例缩小 10%。
() 4、图片放缩 案例一:opencv加载一个灰度图 案例二:opencv+matplotib绘图 二、视频的读取、显示、保存 1、摄像头捕获视频 2、从文件中播放视频 3、保存视频 三、opencv 延伸二:图像求差值报错: 延伸三:视频保存 延伸四:图像画框+写中文+python3读写中文 延伸六: 最简单检验矩形框,cv2代码 延伸五:更精致的画框(带中文) ---- 一、图片 + 读入、显示、 • cv2.IMREAD_GRAYSCALE:以灰度模式读入图像 • cv2.IMREAD_UNCHANGED:读入一幅图像,并且包括图像的 alpha 通道 注意: 就算图像的路径是错的, OpenCV 在图像上绘制白色的 OpenCV。 . ---- 延伸一: 获取图片属性 参考:Python-OpenCV 处理图像(一):基本操作 import cv2 img = cv2.imread('img/image.png') print img.shape
OpenCV与仿射变换 拉伸、收缩、扭曲、旋转是图像的几何变换,在三维视觉技术中大量应用到这些变换,又分为仿射变换和透视变换。 ? 由图可以看出,仿射变换是透视变换的子集。 相关函数: 1.getAffineTransform 由三对点计算仿射变换 src:输入图像的三角形顶点坐标。 dst:输出图像的相应的三角形顶点坐标。 返回一个2x3的变换矩阵。 ? 2.warpAffine函数 对图像做仿射变换 src:输入图像. dst:输出图像. map_matrix:2×3 变换矩阵 flags:插值方法和以下开关选项的组合 ? src = imread( argv[1], 1 ); /// 设置目标图像的大小和类型与源图像一致 warp_dst = Mat::zeros( src.rows, src.cols , src.type() ); /// 设置源图像和目标图像上的三组点以计算仿射变换 srcTri[0] = Point2f( 0,0 ); srcTri[1] = Point2f(
iOS中可视化拉伸图片技巧 一、补充 在我的另一篇博客http://my.oschina.net/u/2340880/blog/403996中探讨了IOS拉伸图像(UIImage)的几种方法和一些小经验 ,这篇是一个补充,再将xcode中的另一种可视化拉伸图像的方法的使用介绍给大家。 如上图,有三条竖直线,其中边界的两条分别约束了图片两侧不被拉伸的区域范围,中间虚线和左侧虚线围成的部分,将是被复制拉伸的区域。水平方向的线同理。 3、在xib文件中UIImage的拉伸 在xib文件中的UIImageView,在上面加上图片后,可以设置stretching这个属性: ? 后两个参数分别设置图片拉伸区域的宽度和高度,比如我们这样设置:Width=0.8,Height=0.8,则图片拉伸时上下左右各1/10的宽度不会被拉伸,中间部分被拉伸,还是刚才的图片,效果如下: ?
腾讯云图像分析基于深度学习等人工智能技术,提供综合性图像理解、图像处理、图像质量评估等服务,包含图像标签、logo识别、动漫人物识别、植物识别等,可以用于智能相册、视频理解、AI营销等场景…..
扫码关注云+社区
领取腾讯云代金券