Questions tagged «image-processing»

与数字图像处理有关的任何事物,即用于从数字图像中提取或操纵信息的理论和技术。

6
重新采样表示图像的numpy数组
我正在寻找如何以新的大小重新采样表示图像数据的numpy数组,最好选择插值方法(最近,双线性等)。我知道有 scipy.misc.imresize 通过包装PIL的调整大小功能可以做到这一点。唯一的问题是,由于它使用PIL,因此numpy数组必须符合图像格式,最多只能提供4个“颜色”通道。 我希望能够使用任意数量的“彩色”通道来调整任意图像的大小。我想知道是否有简单的方法可以在scipy / numpy中执行此操作,或者是否需要自己滚动。 对于如何炮制自己,我有两个想法: scipy.misc.imresize分别在每个通道上运行的功能 创建自己的使用 scipy.ndimage.interpolation.affine_transform 对于大数据,第一个可能很慢,而第二个似乎没有提供除样条线之外的任何其他插值方法。

3
使用OpenCV在Python中反转图像
我想加载彩色图像,将其转换为灰度,然后反转文件中的数据。 我需要的是:遍历OpenCV中的数组并使用此公式更改每个值(这可能是错误的,但对我来说似乎很合理): img[x,y] = abs(img[x,y] - 255) 但我不明白为什么它不起作用: def inverte(imagem, name): imagem = abs(imagem - 255) cv2.imwrite(name, imagem) def inverte2(imagem, name): for x in np.nditer(imagem, op_flags=['readwrite']): x = abs(x - 255) cv2.imwrite(name, imagem) if __name__ == '__main__': nome = str(sys.argv[1]) image = cv2.imread(nome) gs_imagem = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) inverte(gs_imagem, "invertida.png") inverte2(gs_imagem, …

3
如何在OpenCV中定义分水岭的标记?
我正在使用OpenCV为Android编写。我正在使用标记控制的分水岭对类似于下面的图像进行分割,而无需用户手动标记图像。我打算将区域最大值用作标记​​。 minMaxLoc()会给我带来价值,但是如何将其限制在我感兴趣的斑点上?我可以利用来自findContours()或cvBlob Blob的结果来限制ROI并将最大值应用于每个Blob吗?

4
如何在OpenCV(Python)中将灰度图像转换为RGB?
我正在学习使用OpenCV进行实时应用程序的图像处理。我对图像进行了一些阈值处理,并希望将轮廓标记为绿色,但是由于我的图像是黑白图像,所以它们没有显示为绿色。 在程序的早期,我曾经gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)将RGB转换为灰度,但是回过头来,我很困惑,该函数backtorgb = cv2.cvtColor(gray,cv2.CV_GRAY2RGB)给出了: AttributeError:“模块”对象没有属性“ CV_GRAY2RGB”。 下面的代码似乎不是用绿色绘制轮廓。这是因为它是灰度图像吗?如果是这样,我可以将灰度图像转换回RGB,以绿色显示轮廓吗? import numpy as np import cv2 import time cap = cv2.VideoCapture(0) while(cap.isOpened()): ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) ret, gb = cv2.threshold(gray,128,255,cv2.THRESH_BINARY) gb = cv2.bitwise_not(gb) contour,hier = cv2.findContours(gb,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE) for cnt in contour: cv2.drawContours(gb,[cnt],0,255,-1) gray = cv2.bitwise_not(gb) cv2.drawContours(gray,contour,-1,(0,255,0),3) cv2.imshow('test', …


5
返回一个PHP页面作为图像
我正在尝试读取图像文件(准确地说是.jpeg),并将其“回显”回页面输出,但是却显示了图像... 我的index.php具有这样的图像链接: <img src='test.php?image=1234.jpeg' /> 和我的PHP脚本基本上做到这一点: 1)读取1234.jpeg 2)echo文件内容... 3)我觉得我需要使用mime类型返回输出,但这是我迷路的地方 一旦弄清楚了,我将删除所有一起输入的文件名,并将其替换为图像ID。 如果我不清楚,或者您需要更多信息,请回复。

8
如何基于方向元数据旋转JPEG图像?
我有一些服务器代码,当上载图像时会生成缩略图。问题在于,即使在任何图像查看软件中以正确的方向显示完整尺寸的图像时,当拍摄图像并旋转相机/设备时,缩略图也会旋转。只有jpg会发生这种情况。 使用OSX上的Preview,我可以看到jpg内嵌了方向元数据。当我使用ImageTools(Grails插件)生成缩略图时,EXIF元数据不在缩略图中,这就是缩略图显示为旋转状态的原因。 通过脱机对话,我了解到虽然读取EXIF元数据相对容易,但是没有简单的写入方法,这就是为什么在生成jpg缩略图时数据会丢失的原因。 所以看来我有两个选择: 使用ImageMagick生成缩略图。缺点是它需要在我们的服务器上安装更多软件。 读取EXIF方向数据是代码并适当旋转缩略图。 有人知道其他选择吗?

3
如何使用OpenCV获取数独网格的单元格?
最近几天,我一直在尝试从图片中获取数独网格,而我一直在努力获取网格的较小正方形。我正在处理下面的图片。我以为用Canny滤镜处理图像会很好,但是没有,而且我无法获得每个正方形的每个轮廓。然后,我将自适应阈值,otsu和经典阈值放入测试中,但是每次似乎都无法捕捉到每个小方块。 最终目标是获取包含数字的单元格,并使用pytorch识别数字,因此我真的很想获得一些清晰的数字图像,以使识别不会出错:) 有人会对如何实现这一目标有想法吗?在此先多谢!:D

2
检测图像中的多个矩形
我试图检测这张图片中的管道数。为此,我正在使用OpenCV和基于Python的检测。根据对类似问题的现有答案,我能够提出以下步骤 打开图片 筛选 应用边缘检测 使用轮廓 检查计数 当我们手动给定或取4时,管道的总数约为909。 应用滤镜后 import cv2 import matplotlib.pyplot as plt import numpy as np img = cv2.imread('images/input-rectpipe-1.jpg') blur_hor = cv2.filter2D(img[:, :, 0], cv2.CV_32F, kernel=np.ones((11,1,1), np.float32)/11.0, borderType=cv2.BORDER_CONSTANT) blur_vert = cv2.filter2D(img[:, :, 0], cv2.CV_32F, kernel=np.ones((1,11,1), np.float32)/11.0, borderType=cv2.BORDER_CONSTANT) mask = ((img[:,:,0]>blur_hor*1.2) | (img[:,:,0]>blur_vert*1.2)).astype(np.uint8)*255 我得到了这张蒙面的图像 就显示的可见矩形数量而言,这看起来相当准确。但是,当我尝试进行计数并在图片顶部绘制边框时,它也会选择很多不需要的区域。对于圆,HoughCircles具有定义最大和最小半径的方法。矩形是否有类似的东西可以提高精度。另外,我也乐于接受有关此问题的替代方法的建议。 ret,thresh = cv2.threshold(mask,127,255,0) contours,hierarchy …

5
即使一个图像的裁剪/比率略有不同,我如何检测到两个图像“相同”?
我有两个不同的图像: 在100px 或400px 和 宽度为100 像素或400像素 如您所见,从人类的角度来看,两者显然是“相同的”。现在,我想以编程方式检测它们是否相同。我一直在通过rmagick像这样的红宝石来使用图像魔术: img1 = Magick::Image.from_blob(File.read("image_1.jpeg")).first img2 = Magick::Image.from_blob(File.read("image_2.jpeg")).first if img1.difference(img2).first < 4000.0 # I have found this to be a good threshold, but does not work for cropped images puts "they are the same!!!" end 虽然这对于具有相同比率/裁切的图像效果很好,但是当裁切略有不同并且调整为相同宽度时,这不是理想的选择。 有没有一种方法可以对不同裁切的图像进行处理?我对一种可以说类似的解决方案很感兴趣:一个图像包含在另一个图像中,并且覆盖了大约90%的位置。 PS。如果有帮助,我可以以更高的分辨率获得图像(例如,双倍)


3
使用OpenCV从桌面游戏纸牌图像中提取插图
我在python中编写了一个小脚本,试图提取或裁剪仅代表艺术品的扑克牌部分,然后删除所有其余部分。我一直在尝试各种阈值方法,但无法达到目标。还要注意,我不能简单地手动记录图稿的位置,因为它并不总是处于相同的位置或大小,而是总是呈矩形,而其他所有内容都是文本和边框。 from matplotlib import pyplot as plt import cv2 img = cv2.imread(filename) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) ret,binary = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY) binary = cv2.bitwise_not(binary) kernel = np.ones((15, 15), np.uint8) closing = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel) plt.imshow(closing),plt.show() 当前输出是我能得到的最接近的东西。我可能是正确的方法,并尝试进一步进行围绕白色部分绘制矩形的尝试,但是我认为这不是可持续的方法: 最后一点,请参阅下面的卡片,并非所有框架的尺寸或位置都完全相同,但是总会有一件艺术品,其周围只有文字和边框。它不一定要精确切割,但是很明显,艺术是卡片的“区域”,周围是包含文本的其他区域。我的目标是尽我所能捕获艺术品的区域。

1
OCR的清洁图像
我一直在尝试清除OCR的图像:(线条) 我需要删除这些行以有时对图像进行进一步处理,并且我已经很接近了,但是在很多情况下,阈值从文本中去除了太多: copy = img.copy() blur = cv2.GaussianBlur(copy, (9,9), 0) thresh = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,11,30) kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9,9)) dilate = cv2.dilate(thresh, kernel, iterations=2) cnts = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] for c in cnts: area = cv2.contourArea(c) if area > 300: x,y,w,h = …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.