标签: image-processing

比较两个直方图

对于一个小项目,我需要将一个图像与另一个图像进行比较 - 以确定图像是否大致相同.图像很小,从25到100px不等.图像意味着具有相同的图像数据但是非常不同,因此简单的像素相等检查将不起作用.考虑以下两种可能的情况:

  1. 观看展览的博物馆中的安全(CCTV)摄像机:我们希望快速查看两个不同的视频帧是否显示相同的场景,但是照明和摄像机焦点的细微差别意味着它们将不相同.
  2. 与以48x48渲染的相同图标相比,以64x64渲染的矢量计算机GUI图标的图片(但是两个图像将缩小到32x32,因此直方图具有相同的总像素数).

我决定使用直方图来表示每个图像,使用三个1D直方图:每个RGB通道一个 - 我可以安全地使用颜色并忽略纹理和边缘直方图(另一种方法是为每个图像使用单个3D直方图,但我避免这样做,因为它增加了额外的复杂性).因此,我需要比较直方图,看看它们有多相似,如果相似性度量超过某个阈值,那么我可以放心地说各个图像在视觉上是相同的 - 我将比较每个图像的相应通道直方图(例如图像1的红色直方图带有图像2的红色直方图,然后是图像1的蓝色直方图和图像2的蓝色直方图,然后是绿色直方图 - 所以我不是将图像1的红色直方图与图像2的蓝色直方图进行比较,这只是愚蠢的.

假设我有这三个直方图,它们代表三个图像的红色RGB通道的摘要(为简单起见,使用5个像素用于7像素图像):

H1            H2            H3 

  X           X                     X
  X   X       X       X             X
X X   X X     X X   X X     X X X X X
0 1 2 3 4     0 1 2 3 4     0 1 2 3 4

H1 = [ 1, 3, 0, 2, 1 ]
H2 = [ 3, 1, 0, 1, 2 ]
H3 = [ 1, 1, 1, 1, 3 ] 
Run Code Online (Sandbox Code Playgroud)

图像1( …

image-processing histogram

49
推荐指数
5
解决办法
7万
查看次数

使用ImageIO.write jpg文件的问题:粉红色的背景

我正在使用以下代码编写jpg文件:

String url="http://img01.taobaocdn.com/imgextra/i1/449400070/T2hbVwXj0XXXXXXXXX_!!449400070.jpg";
String to="D:/temp/result.jpg";
ImageIO.write(ImageIO.read(new URL(url)),"jpg", new File(to));
Run Code Online (Sandbox Code Playgroud)

但我得到的result.jpg是一个粉红色的背景图片:

替代文字

java image-processing

48
推荐指数
3
解决办法
5万
查看次数

只有PNG支持透明度,这是真的吗?

我发现JPG不支持透明度,alpha值总是255.我想知道只有png支持透明度?

png jpeg image image-processing

48
推荐指数
3
解决办法
6万
查看次数

如何从此类图像中删除背景?

IMAGE_1

我想删除此图像的背景以仅获取此人.我有这样的数千张图像,基本上是一个人和一些有点白色的背景.

我所做的是使用边缘检测器,如canny边缘检测器或sobel过滤器(来自skimage库).那么我认为可以做的是,使边缘内的像素变白并使像素变黑.之后,原始图像可以被掩盖以仅获取人物的图像.

然而,使用canny边缘检测器很难获得封闭边界.使用Sobel滤波器的结果并不差,但我不知道如何从那里开始.

Sobel_result

编辑:

是否有可能去除右手和裙子之间以及头发之间的背景?

python opencv image-processing scikit-image

48
推荐指数
5
解决办法
3万
查看次数

如何提高g.drawImage()方法的性能来调整图像大小

我有一个应用程序,用户可以在相册中上传图片,但自然上传的图像需要调整大小,因此也有拇指可用,所显示的图片也适合页面(例如800x600).我调整大小的方式是这样的:

Image scaledImage = img.getScaledInstance((int)width, (int)height, Image.SCALE_SMOOTH);
BufferedImage imageBuff = new BufferedImage((int)width, (int)height, BufferedImage.TYPE_INT_RGB);
Graphics g = imageBuff.createGraphics();
g.drawImage(scaledImage, 0, 0, new Color(0,0,0), null);
g.dispose();
Run Code Online (Sandbox Code Playgroud)

它工作得很好.我唯一的问题是这个g.drawImage()方法看起来非常慢,而我无法想象用户要耐心等待上传20张图片20*10秒~3分钟.事实上,在我的电脑上,为单张照片制作3种不同的调整大小需要近40秒.

这还不够好,我正在寻找更快的解决方案.我想知道是否有人可以通过调用shell脚本,命令告诉我有关更好的一个,或者通过调用shell脚本,命令,无论你知道什么,它必须更快,其他一切都无关紧要.

java image-processing

47
推荐指数
7
解决办法
9万
查看次数

如何在C#中处理像素级别的图像

如何在C#中以像素级操作图像?

我需要能够分别读取/修改每个位图像素RGB值.

代码示例将不胜感激.

c# image-manipulation image-processing

46
推荐指数
3
解决办法
9万
查看次数

透视变形矩形的比例

给出了由透视图扭曲的矩形的2d图片:

在此输入图像描述

我知道形状最初是一个矩形,但我不知道它的原始大小.

如果我知道这张照片中角落的像素坐标,我该如何计算原始比例,即矩形的商(宽度/高度)?

(背景:目标是自动取消矩形文档的照片,边缘检测可能会用hough变换完成)

更新:

已经讨论了是否有可能根据给出的信息确定宽度:高度比.我天真的想法是它必须是可能的,因为我认为没有办法将例如1:4的矩形投射到上面描绘的四边形上.该比率显然接近1:1,因此应该有一种方法可以在数学上确定它.然而,除了我的直觉猜测,我没有证据证明这一点.

我还没有完全理解下面提出的论点,但我认为必须有一些隐含的假设,即我们在这里缺少这种假设并且有不同的解释.

然而,经过几个小时的搜索,我终于找到了一些与问题相关的论文.我很难理解那里使用的数学,到目前为止还没有成功.特别是第一篇论文似乎准确地讨论了我想要做的事情,遗憾的是没有代码示例和非常密集的数学.

geometry reverseprojection image-processing computer-vision projective-geometry

46
推荐指数
2
解决办法
2万
查看次数

检测图片的"整体平均"颜色

我有一个jpg图像.

我需要知道"整体平均"的图像颜色.乍一看,可以使用图像的直方图(通道RGB).

在工作中我主要使用JavaScript和PHP(一点点Python)因此欢迎这些语言的决定.也许是用于处理解决类似问题的图像的库.

我不需要动态确定图片的颜色.我只需要浏览整个图像阵列并分别确定每种图像的颜色(这些信息我将记住以备将来使用).

javascript php python image-processing

46
推荐指数
2
解决办法
3万
查看次数

从8个连接像素列表中提取片段

目前的情况:我正在尝试从图像中提取片段.感谢openCV的findContours()方法,我现在有一个每个轮廓的8连接点列表.但是,这些列表不能直接使用,因为它们包含大量重复项.

问题:给定一个包含重复项的8个连接点的列表,从中提取段.

可能的解决方案 :

  • 起初,我使用openCV的approxPolyDP()方法.然而,结果非常糟糕......这是缩放的轮廓:

在此输入图像描述

以下是结果approxPolyDP():(9段!有些重叠)

在此输入图像描述

但我想要的更像是:

在此输入图像描述

这很糟糕,因为approxPolyDP()可以在"几个细分"中转换"看起来像几个细分"的东西.但是,我所拥有的是一个点列表,这些点往往会对自己进行多次迭代.

例如,如果我的观点是:

0 1 2 3 4 5 6 7 8 
  9   
Run Code Online (Sandbox Code Playgroud)

然后,点的列表将是0 1 2 3 4 5 6 7 8 7 6 5 4 3 2 1 9......如果点的数量变大(> 100),那么提取的段approxPolyDP()不幸地不是重复的(即:它们彼此重叠,但是不是非常相等,所以我可以'只是说"删除重复",而不是像素一样)

  • 也许,我有一个解决方案,但它很长(虽然很有趣).首先,对于所有8个连接列表,我创建一个稀疏矩阵(为了效率),如果像素属于列表,则将矩阵值设置为1.然后,我创建一个图形,其中节点对应于像素,相邻像素之间的边缘.这也意味着我在像素之间添加了所有缺失的边缘(复杂性很小,可能因为稀疏矩阵).然后我删除所有可能的"正方形"(4个neighouring节点),这是可能的,因为我已经在很薄的轮廓上工作.然后我可以启动最小生成树算法.最后,我可以使用openCV来近似树的每个分支approxPolyDP()

细分http://img197.imageshack.us/img197/4488/segmentation.png

这是原始列​​表的精彩图片(感谢Paint!)和相关图表.然后,当我在邻居之间添加边缘时.最后,当我删除边缘并制作最小生成树(这里没用)

总结一下:我有一个乏味的方法,我还没有实现,因为它似乎容易出错.但是,我问,StackOverflow的人:是否有其他现有的方法,可能有很好的实现?


编辑:澄清一下,一旦我有一棵树,我就可以提取"分支"(分支从叶子或连接到3个或更多其他节点的节点开始)然后,openCV中的算法approxPolyDP()Ramer-Douglas-Peucker算法,这里是维基百科的图片:

在此输入图像描述

通过这张图片,很容易理解为什么当点可能彼此重复时它会失败


另一个编辑:在我的方法中,有一些东西可能有趣值得注意.当您考虑位于网格中的点(如像素)时,通常,最小生成树算法没有用,因为有许多可能的最小树

X-X-X-X
|
X-X-X-X
Run Code Online (Sandbox Code Playgroud)

在基金会上是非常不同的 …

c++ opencv graph image-processing boost-graph

46
推荐指数
3
解决办法
5580
查看次数

特征检测与描述符提取的区别

有谁知道OpenCV 2.3中FeatureDetection和DescriptorExtraction之间的区别?我知道后者是使用DescriptorMatcher进行匹配所必需的.如果是这种情况,FeatureDetection用于什么?

谢谢.

opencv image-processing feature-extraction computer-vision feature-detection

46
推荐指数
2
解决办法
3万
查看次数