数字图像处理
本人学习Java的图像处理的一些心得和一些算法总结。
嘿哈哈哈
人生就像一场演出,不到谢幕永远不知道自己有多精彩。
展开
-
关于OpenCV算法未实现及其版权问题
错误示例如下:cv2.error: OpenCV(3.4.3) C:\projects\opencv-python\opencv_contrib\modules\xfeatures2d\src\sift.cpp:1207: error: (-213:The function/feature is not implemented) This algorithm is patented and i...原创 2018-10-22 20:26:24 · 7273 阅读 · 7 评论 -
OpenCV——使用普通摄像头进行深度估计
使用深度摄像头可以在捕获图像时估计图像与摄像头之间的距离。但是对于普通摄像头,可以使用属于立体视觉(stereo vision)几何学的极几何(Epipolar Geometry)从同一物体的两张不同图像上提取三维信息。下面是一个例子:# 从视差图得到图像深度import cv2import numpy as npfrom matplotlib import pyplot as plt...原创 2018-10-22 20:22:50 · 3472 阅读 · 3 评论 -
OpenCV——根据Haar级联数据进行动态人脸检测
Haar级联由于灯光、视角、视距、摄像头抖动以及数字噪声的变化,一个图像的细节可能会变得不稳定。但是人们在分类时却不会受这些物理细节方面差异的影响。因此,提取出图像的细节对产生稳定分类结果和跟踪结果很有用。即:从图像中提取特征。虽然任意像素都可能影响多个特征,但特征应该比像素数少得多。由此两个图像的相似程度可以通过它们对应特征的欧氏距离来度量。类Haar特征是一种用于实现实时人脸跟踪的特征。每...原创 2018-10-22 19:36:25 · 667 阅读 · 0 评论 -
OpenCV——根据Haar级联数据进行静态人脸检测
Haar级联由于灯光、视角、视距、摄像头抖动以及数字噪声的变化,一个图像的细节可能会变得不稳定。但是人们在分类时却不会受这些物理细节方面差异的影响。因此,提取出图像的细节对产生稳定分类结果和跟踪结果很有用。即:从图像中提取特征。虽然任意像素都可能影响多个特征,但特征应该比像素数少得多。由此两个图像的相似程度可以通过它们对应特征的欧氏距离来度量。类Haar特征是一种用于实现实时人脸跟踪的特征。每...原创 2018-10-22 19:37:05 · 295 阅读 · 0 评论 -
OpenCV——Haar级联人脸正脸检测数据
Haar级联由于灯光、视角、视距、摄像头抖动以及数字噪声的变化,一个图像的细节可能会变得不稳定。但是人们在分类时却不会受这些物理细节方面差异的影响。因此,提取出图像的细节对产生稳定分类结果和跟踪结果很有用。即:从图像中提取特征。虽然任意像素都可能影响多个特征,但特征应该比像素数少得多。由此两个图像的相似程度可以通过它们对应特征的欧氏距离来度量。类Haar特征是一种用于实现实时人脸跟踪的特征。每...原创 2018-10-22 19:33:42 · 567 阅读 · 4 评论 -
OpenCV——Haar级联人眼检测数据
Haar级联由于灯光、视角、视距、摄像头抖动以及数字噪声的变化,一个图像的细节可能会变得不稳定。但是人们在分类时却不会受这些物理细节方面差异的影响。因此,提取出图像的细节对产生稳定分类结果和跟踪结果很有用。即:从图像中提取特征。虽然任意像素都可能影响多个特征,但特征应该比像素数少得多。由此两个图像的相似程度可以通过它们对应特征的欧氏距离来度量。类Haar特征是一种用于实现实时人脸跟踪的特征。每...原创 2018-10-22 19:38:09 · 740 阅读 · 1 评论 -
OpenCV——使用分水岭算法进行图像分割
下面的示例代码主要有这几步:加载图像并转为灰度,设置一个阈值,将图像分为黑色部分和白色部分。通过morphologyEx()变换来去除噪声数据。使用dilate()函数得到大部分都是背景的区域。使用distanceTransform()函数的到最可能是前景的区域,并应用一个阈值来判断最可能为前景的区域。前景与背景区域相减得到边界区域。示例代码如下:...原创 2018-10-19 22:27:28 · 832 阅读 · 0 评论 -
OpenCV——使用GrabCut算法进行物体分割
GrabCut算法的实现步骤为:在图片中定义含有(一个或多个)物体的矩形。矩形外的区域被自动认为是背景。对于用户定义的矩形区域,可用背景中的数据来区别它里面的前景和背景区域。用高斯混合模型(Gaussians Mixture Model,GMM)来对背景和前景建模,并将未定义的像素标记为可能的前景或背景。图像中的每一个像素都被看作通过虚拟边与周围像素相连接,而每条边都有一个属于前景或背...原创 2018-10-19 22:21:55 · 3016 阅读 · 0 评论 -
OpenCV——圆检测
使用cv2.HoughCircles()函数进行圆检测。函数原型:cv2.HoughCircles(image,method,dp,minDist[, circles[,param1, param2[,minRadius[,maxRadius]]]]])参数设置:image:源图像;method:cv2.HOUGH_GRADIENT 也就是霍夫圆检测,梯度法;dp:计数器的分...原创 2018-10-05 15:22:50 · 5273 阅读 · 0 评论 -
OpenCV——直线检测
直线检测可以通过OpenCV的HoughLines和HoughLinesP函数来完成,它们仅有的差别是:第一个函数使用标准的Hough变换,第二个函数使用概率Hough变换,即只通过分析点的子集并估计这些点都属于一条直线的概率,这在计算速度上更快。函数原型:HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=No...原创 2018-10-05 15:05:41 · 9729 阅读 · 0 评论 -
OpenCV——凸轮廓与Douglas-Peucker算法
对下面这张图像,计算其近似多边形和凸包。hammer.jpg使用cv2.approxPolyDP()函数计算其近似多边形,其参数列表:第一个参数为源轮廓。第二个参数为ε值,它表示源轮廓与近似多边形周长的最大差值(这个值越小,近似多边形与源轮廓越接近)。第三个参数为布尔标记,它表示这个多边形是否闭合。使用cv2.convexHull()函数计算其凸包。源代码...原创 2018-10-05 14:51:35 · 2393 阅读 · 0 评论 -
OpenCV——边界框、最小矩形区域和最小闭圆的轮廓
对下面这张图像,检测其边界框、最小矩形区域以及最小闭圆的轮廓。hammer.jpg使用cv2.pyrDown()函数缩小图片。使用cv2.threshold()函数进行二值化处理。使用cv2.findContours()函数检测轮廓。使用cv2.boundingRect()函数获得边界框。使用cv2.rectangle()函数绘制边界框。使用cv2.mi...原创 2018-10-05 14:29:55 · 3317 阅读 · 0 评论 -
OpenCV——轮廓检测
首先创建一个测试图像:创建一个200x200的黑色空白图像,在图像的中央放置一个灰色方块。使用cv2.threshold()函数对图像进行二值化处理。使用cv2.findContours()函数获取图像边界将灰度图像转化为BGR并使用cv2.drawContours()函数绘制图像边界源代码# 轮廓检测import cv2import numpy as np...原创 2018-10-05 13:48:02 · 1476 阅读 · 0 评论 -
OpenCV——Canny边缘检测
Canny边缘检测算法有5个步骤:使用高斯滤波器对图像进行去噪。计算梯度。在边缘上使用非最大抑制(NMS),即检查每一个像素,看此像素是否是周围具有相同梯度方向中最大的。在检测到的边缘上使用双阈值去除假阳性,需要两个参数minVal和maxVal。图像灰度梯度高于maxVal被认为是真正的边界,低于minVal的被舍弃。分析所有边缘及其之间的连接,以保留真正的边缘并消...原创 2018-10-05 13:25:20 · 1097 阅读 · 2 评论 -
OpenCV——卷积滤波器
卷积滤波器是基于核的滤波器,其实核是一组权重,它决定如何通过邻近像素点来计算新的像素点。核也称为卷积矩阵,它对一个区域的像素做调和或卷积运算。OpenCV提供了一个非常通用的filter2D()函数,它运用由用户指定的任意核或卷积矩阵。cv2.filter2D(src, -1, kernel, dst)第二个参数指定了目标图像每个通道的位深度(比如,位深度cv2.CV_8U表示每个通道为8...原创 2018-10-05 13:09:19 · 2920 阅读 · 0 评论 -
OpenCV——边缘检测
OpenCV提供了很多边缘检测滤波函数,包括Laplacian()、Sobel()以及Scharr()。这些滤波函数都会将非边缘区域转为黑色,将边缘区域转为白色或其他饱和颜色。例如:import cv2if __name__ == "__main__": img = cv2.imread("lena.jpg") cv2.Laplacian(img, cv2.CV_8U, i...原创 2018-10-05 12:50:43 · 3899 阅读 · 0 评论 -
OpenCV——高通/低通滤波器
高通滤波器(High Pass Filter,HPF)是检测图像的某个区域,然后根据像素与周围像素的亮度差值来提升(boost)该像素的亮度的滤波器。高通滤波器是根据像素与邻近像素的亮度差值来提升该像素的亮度。低通滤波器(Low Pass Filter,LPF)则是在像素与周围像素的亮度差值小于一个特定值时,平滑该像素的亮度。它主要用于去噪和模糊化,例如,高斯模糊是最常用的模糊滤波器(平滑滤波器...原创 2018-10-05 10:54:08 · 10755 阅读 · 0 评论 -
OpenCV——在窗口显示视频帧
OpenCV的namedWindow()、imshow()和DestoryWindow()函数允许指定窗口名来创建、显示和销毁窗口。此外,任意窗口下都可以通过waitKey()函数来获取键盘输入,通过setMouseCallback()函数来获取鼠标输入。以下代码可以实时显示摄像头帧:import cv2clicked = Falsedef on_mouse(event, x, y, ...原创 2018-09-29 22:19:19 · 2001 阅读 · 0 评论 -
OpenCV——在窗口显示图像
OpenCV的窗口函数和waitKey()函数相互依赖OpenCV窗口只有在调用waitKey()函数时才会更新,waitKey()函数只有在OpenCV窗口成为活动窗口时,才能捕获输入信息。源代码import cv2img = cv2.imread('000.jpg')cv2.imshow('000 jpg', img)cv2.waitKey()cv2.destroyAllWi...原创 2018-09-29 22:18:43 · 1583 阅读 · 0 评论 -
OpenCV——获得摄像头的帧流
VideoCapture类可以获得摄像头的帧流。对摄像头而言,需要传递摄像头的设备索引。下面的例子会捕获摄像头10秒的视频信息,并将其写入一个AVI文件中。但是当VideoCapture类所使用的终端不支持查询的这个属性时,会返回0。例如,get()。源代码import cv2cameraCapture = cv2.VideoCapture(0)fps = 30size = (in...原创 2018-09-29 22:18:01 · 1222 阅读 · 2 评论 -
OpenCV——读取视频文件
OpenCV提供了VideoCapture类和VideoWriter类来支持各种的视频文件。支持的格式类型会因系统的不同而变化,但应该都支持AVI格式。在到达视频文件末尾之前,VideoCapture类可通过read()函数来获取新的帧,每帧是一副基于BGR格式的图像。可将一副图像传递给VideoWriter类的write()函数,该函数会将这幅图像加到VideoWriter类所指向的文件中。...原创 2018-09-29 22:17:09 · 3995 阅读 · 0 评论 -
OpenCV——使用numpy.array访问图像数据
使用numpy.array读取并修改图像数据源代码import cv2import numpy as npimg = cv2.imread('000.jpg')print(type(img))print(img[150, 120, 0])print(img.item(150, 120, 0))print(img.shape)print(img.size)print(img...原创 2018-09-29 22:14:17 · 2858 阅读 · 0 评论 -
OpenCV——图像与原始字节之间的转换
一个OpenCV的图像是一个array类型的二维或三维数组。8位的灰度图像是一个含有字节值的二维数组。一个24位的BGR图像是一个三维数组,它也包含了字节值。可以使用image[0, 0]或image[0, 0, 0]来访问。随机生成120000个字节,将其转化为300400的OpenCV灰度图像和100400*3的OpenCV BGR图像。源代码import cv2import nu...原创 2018-09-29 22:12:50 · 2398 阅读 · 0 评论 -
OpenCV——读取图像文件
创建一个简单的黑色正方形图像图像转化为BGR格式图像文件的读写BGR图像转化为灰度图像源代码import numpy as npimport cv2img = np.zeros((3,3), dtype=np.uint8)print(img)print(img.shape)print('------------------')img = cv2.cvtColor(...原创 2018-09-29 22:05:40 · 446 阅读 · 0 评论 -
图像色彩空间转换——RGB与HSL/HSV
色彩空间RGB色彩空间RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。HSL/HSV色彩空间HSL色彩模式是工业界的一种颜色标准,是通过对色相(H)、饱和度(S)、明...原创 2018-07-27 09:11:23 · 3901 阅读 · 0 评论 -
BufferedImage常见问题
一、BufferedImage对象像素的读写方法读取一个像素点的RGB值的代码如下: index = row * width + col; ta = (pixels[index] >> 24) & 0xff; tr = (pixels[index] >&a原创 2018-07-25 22:38:27 · 2448 阅读 · 0 评论 -
BufferedImageOp接口实现滤镜
BufferedImageOp接口的实现原创 2018-07-25 22:38:51 · 1482 阅读 · 0 评论 -
BufferedImage的创建与保存
BufferedImage的创建与保存原创 2018-07-24 23:29:44 · 15887 阅读 · 1 评论 -
BufferedImage的重要组成:ColorModel
BufferedImage的重要组成:ColorModel原创 2018-07-24 23:16:06 · 3393 阅读 · 0 评论 -
BufferedImage的重要组成:Raster
BufferedImage的重要组成:Raster原创 2018-07-24 23:04:13 · 1892 阅读 · 0 评论 -
照片转ASCII
原始照片ASCII照片原始ASCII文件大图很难想象一个一个数字输入进去最后成为一张照片是多么困难吧,其实很简单,一个程序就可以搞定。一,读取图片二,彩色图片转换为灰度图片三,根据相应的灰度值转换为对应ASCII码输出示例程序from PIL import Imagefrom pylab import *def Gray(R, G, B): re...原创 2018-06-07 23:32:51 · 3134 阅读 · 15 评论 -
详解计算机视觉五大技术:图像分类、对象检测、目标跟踪、语义分割和实例分割
目前,计算机视觉是深度学习领域最热门的研究领域之一。计算机视觉实际上是一个跨领域的交叉学科,包括计算机科学(图形、算法、理论、系统、体系结构),数学(信息检索、机器学习),工程学(机器人、语音、自然语言处理、图像处理),物理学(光学 ),生物学(神经科学)和心理学(认知科学)等等。许多科学家认为,计算机视觉为人工智能的发展开拓了道路。那么什么是计算机视觉呢? 这里给出了几个比较严谨的定义:...转载 2018-05-09 19:37:46 · 10761 阅读 · 2 评论 -
从RGB色转为灰度色算法
一、基础 对于彩色转灰度,有一个很著名的心理学公式: Gray = R*0.299 + G*0.587 + B*0.114二、整数算法 而实际应用时,希望避免低速的浮点运算,所以需要整数算法。 注意到系数都是3位精度的没有,我们可以将它们缩放1000倍来实现整数运算算法: Gray = (R*299 + G*587 + B*114 + 500) / 100...转载 2018-05-07 09:33:53 · 660 阅读 · 0 评论