天道酬勤,学无止境

Why doesn't cv2 dilate actually affect my image?

So, I'm generating a binary (well, really gray scale, 8bit, used as binary) image with python and opencv2, writing a small number of polygons to the image, and then dilating the image using a kernel. However, my source and destination image always end up the same, no matter what kernel I use. Any thoughts?

from matplotlib import pyplot
import numpy as np
import cv2

binary_image = np.zeros(image.shape,dtype='int8')
for rect in list_of_rectangles: 
    cv2.fillConvexPoly(binary_image, np.array(rect), 255)
kernel = np.ones((11,11),'int')
dilated = cv2.dilate(binary_image,kernel)
if np.array_equal(dilated, binary_image):
    print("EPIC FAIL!!")
else:
    print("eureka!!")

All I get is EPIC FAIL!

Thanks!

标签

评论

So, it turns out the problem was in the creation of both the kernel and the image. I believe that openCV expects 'uint8' as a data type for both the kernel and the image. In this particular case, I created the kernel with dtype='int', which defaults to 'int64'. Additionally, I created the image as 'int8', not 'uint8'. Somehow this did not trigger an exception, but caused the dilation to fail in a surprising fashion.

Changing the above two lines to

binary_image = np.zeros(image.shape,dtype='uint8')

kernel = np.ones((11,11),'uint8')

Fixed the problem, and now I get EUREKA! Hooray!

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 形态学操作中的迭代与内核大小 (OpenCV)(Iterations vs. Kernel Size in Morphological Operations (OpenCV))
    问题 我一直在使用变形。 在 OpenCV 中打开以通过 opencv 减少图像中 ROI 之外的噪声,直到现在,每当我需要更高程度的降噪时,我只是随机增加内核大小或增加迭代次数,直到我满意为止。 但是,根据您增加的内容/您将如何决定在给定情况下更改哪些内容,结果是否存在显着差异? 除了猜测和检查之外,我试图想出一种更好的方法来改变我改变的参数(改变多少)。 回答1 这取决于内核类型。 对于使用奇数平方核进行扩张或侵蚀,无论是增加大小还是增加迭代次数(假设使用的值使它们相等)都没有区别。 例如: >>> M = np.zeros((7,7), dtype=np.uint8) >>> M[3,3] = 1 >>> k1 = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3)) >>> M1 = cv2.dilate(M, k1, iterations=2) >>> k2 = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5)) >>> M2 = cv2.dilate(M, k2, iterations=1) >>> M1 [[0 0 0 0 0 0 0] [0 1 1 1 1 1 0] [0 1 1 1 1 1 0] [0 1 1 1 1 1 0] [0 1 1 1 1 1 0] [0 1 1 1
  • 卡尔曼滤波器总是预测原点(Kalman filter always predicting origin)
    问题 我正在学习卡尔曼滤波器以进行轨迹预测。 现在,我能够跟踪球。 对于我第一次使用预测和卡尔曼滤波器的实际尝试,我使用了一个绘制线的例子,如下所示: 有没有 cv2.KalmanFilter 实现的例子? 这是完整的代码: import cv2 import numpy as np import math cap = cv2.VideoCapture('videoplayback (1).mp4') loHue = 0 loSaturation = 50 loValue = 50 high_hue = 0 high_saturation = 255 high_value = 255 flag_for_center = 1 def low_hue(x): global loHue loHue = x #def low_saturation(x): #global loSaturation #loSaturation = x #def low_value(x): #global loValue #loValue = x def upper_hue (x): global high_hue high_hue = x #def upper_saturation(x): #global high_saturation #high_saturation= x #def upper_value
  • 从python中的数独谜题中提取网格(Extracting grid from a sudoku puzzle in python)
    问题 我目前正在 python 中学习 OpenCV,我正在尝试在此图像上绘制网格的轮廓以从中提取数独谜题 这是我为这个特定问题编写的代码: CONST_IMAGE_PATH = "sudoku-original.jpg" CONST_COEFF = 0.02 def main(): originalImage = cv2.imread(CONST_IMAGE_PATH) img = cv2.imread(CONST_IMAGE_PATH,0) img = cv2.medianBlur(img,5) img = cv2.adaptiveThreshold(img , 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,11,2) img = cv2.bitwise_not(img,img) print "thresholding the image" cv2.imshow("Thresholded", img) kernel = np.empty((3,3),'uint8') kernel[0][0] = 0 kernel[0][1] = 1 kernel[0][2] = 0 kernel[1][0] = 1 kernel[1][1] = 1 kernel[1][2] = 1 kernel[2][0] = 0 kernel
  • 微调霍夫线函数参数 OpenCV(Fine Tuning Hough Line function parameters OpenCV)
    问题 我一直在尝试在正方形周围绘制 4 条线,以便获得正方形的顶点。 由于准确性,我将采用这种方法,而不是直接使用 Harris 或轮廓方法找到角点。 在opencv的内置函数中使用houghlines我无法获得全长线来获得交点,而且我也得到了太多不相关的线。 我想知道是否可以微调参数以满足我的要求? 如果是,我该怎么做? 我的问题与这里的问题完全相同。 但是,即使更改了这些参数,我也没有得到这些行。 我附上了原始图像以及代码和输出: 原图: 代码: #include <Windows.h> #include "opencv2\highgui.hpp" #include "opencv2\imgproc.hpp" #include "opencv2/imgcodecs/imgcodecs.hpp" #include "opencv2/videoio/videoio.hpp" using namespace cv; using namespace std; int main(int argc, const char** argv) { Mat image,src; image = imread("c:/pics/output2_1.bmp"); src = image.clone(); cvtColor(image, image, CV_BGR2GRAY); threshold
  • 图像处理中的角点检测 Opencv Python(Corner detection in Image processing Opencv Python)
    问题 我有一个盒子的图像。 我正在尝试检测角落并从圆圈中标记这些角落。 我为此使用以下代码: import cv2 import numpy as np img_file = 'Image.jpg' img = cv2.imread(img_file, cv2.IMREAD_COLOR) imgDim = img.shape dimA = imgDim[0] dimB = imgDim[1] # RGB to Gray scale conversion img_gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) # Noise removal with iterative bilateral filter(removes noise while preserving edges) noise_removal = cv2.bilateralFilter(img_gray,9,75,75) # Thresholding the image ret,thresh_image = cv2.threshold(noise_removal,220,255,cv2.THRESH_OTSU) th = cv2.adaptiveThreshold(noise_removal, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2
  • Tesseract OCR的Opencv图像转换(Opencv Image transformation for Tesseract OCR)
    问题 我有以下图像,我想将其提供给 tesseract 以检测文本: 输入图像: 我正在使用OTSU转换处理此图像:代码如下: import cv2 import numpy as np from matplotlib import pyplot as plt import glob for img in glob.glob("/home/image.jpg"): cv_img=cv2.imread(img,0) #img = cv2.imread('1.jpg',0) cv_img = cv2.medianBlur(cv_img,5) ret,th1 = cv2.threshold(cv_img,127,255,cv2.THRESH_BINARY) th2 = cv2.adaptiveThreshold(cv_img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\ cv2.THRESH_BINARY,11,2) th3 = cv2.adaptiveThreshold(cv_img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\ cv2.THRESH_BINARY,11,2) cv2.imwrite('OTSU.jpg', th3) 我在此转换后得到的输出图像是: 这是我的条件: 我面临的主要障碍是图像上随机出现的白线。
  • 如何识别openCV中的不完整矩形(How to identify incomplete rectangles in openCV)
    问题 我将如何从图像中识别和提取矩形,如下所示。 请注意,我的矩形可能不完整,有一些缺失的边缘,有些边可能是部分线。 谢谢 ! 回答1 这可以使用形态学操作(例如侵蚀和膨胀)来解决。 这两个操作将有助于创建闭合矩形。 之后,您可以使用本页中的教程来检测简单的形状,例如矩形。 我实现了一个快速演示,它适用于您提供的图像。 主要.py: import cv2 import numpy as np from shapeDetector import ShapeDetector import imutils img = cv2.imread('t.png') kernel = np.ones((5,5),np.uint8) erosion = cv2.erode(img,kernel,iterations = 10) dilate = cv2.dilate(erosion,kernel,iterations = 10) 侵蚀使所有线条变粗,因此要恢复到正常宽度,我们需要在侵蚀后进行扩张。 我建议对 dilate 操作进行一次评论,以了解 erode 是如何工作的,反之亦然。 此操作将像这样转换您的图像 我使用的检测算法需要黑色背景上的白线。 这就是为什么我们需要反转图像。 cv2.bitwise_not ( dilate, dilate ) 之后,我们可以使用教程中的代码。 image =
  • 尝试使用opencv分割字符 - 照明问题(Trying to segment characters using opencv - Ilumination problem)
    问题 我的代码没有很好地检测二进制图像! LpImg = cv2.imread('/content/drive/My Drive/TESTING/Placas_detectadas/CPVL92.png') if (len(LpImg)): #check if there is at least one license image # Scales, calculates absolute values, and converts the result to 8-bit. plate_image = cv2.convertScaleAbs(LpImg[0], alpha=(255.0)) plate_image = LpImg #image_cropped # convert to grayscale and blur the image gray = cv2.cvtColor(plate_image, cv2.COLOR_BGR2GRAY) blur = cv2.GaussianBlur(gray,(7,7),0) # Applied inversed thresh_binary thresh_inv = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 39
  • Extracting grid from a sudoku puzzle in python
    I am currently learning OpenCV in python, and I am trying to draw over the contour of the grid on this image to extract the sudoku puzzle from it This is the code I wrote for this specific problem: CONST_IMAGE_PATH = "sudoku-original.jpg" CONST_COEFF = 0.02 def main(): originalImage = cv2.imread(CONST_IMAGE_PATH) img = cv2.imread(CONST_IMAGE_PATH,0) img = cv2.medianBlur(img,5) img = cv2.adaptiveThreshold(img , 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,11,2) img = cv2.bitwise_not(img,img) print "thresholding the image" cv2.imshow("Thresholded", img) kernel = np.empty((3,3),'uint8')
  • 删除图像中小于 n 大小(噪声)的像素 - 打开 CV python(removing pixels less than n size(noise) in an image - open CV python)
    问题 我正在尝试减少图像中的噪声,并且目前正在运行此代码 import numpy as np import argparse import cv2 from skimage import morphology # Construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required = True, help = "Path to the image") args = vars(ap.parse_args()) # Load the image, convert it to grayscale, and blur it slightly image = cv2.imread(args["image"]) cv2.imshow("Image", image) cv2.imwrite("image.jpg", image) greenLower = np.array([50, 100, 0], dtype = "uint8") greenUpper = np.array([120, 255, 120], dtype = "uint8") green = cv2.inRange(image
  • 使用python和opencv检测图像中的文本区域(Detect text area in an image using python and opencv)
    问题 我想使用python 2.7和opencv 2.4.9检测图像的文本区域,并在其周围绘制一个矩形区域。 如下面的示例图片所示。 我是图像处理的新手,所以任何想法如何做到这一点将不胜感激。 回答1 检测图像中的文本有多种方法。 我建议在这里查看此问题,因为它也可以回答您的问题。 尽管它不在python中,但是代码可以轻松地从c ++转换为python(只需查看一下API,然后将方法从c ++转换为python,就不难了。当我针对自己的独立问题尝试其代码时,我自己做的) 。 这里的解决方案可能不适用于您的情况,但我建议您尝试一下。 如果要执行此操作,请执行以下过程: 准备图像:如果您要编辑的所有图像都大致与您提供的图像相似,则实际设计由一系列灰色组成,并且文本始终为黑色。 我首先将所有不是黑色(或已经是白色)的内容涂白。 这样做将只留下黑色文本。 # must import if working with opencv in python import numpy as np import cv2 # removes pixels in image that are between the range of # [lower_val,upper_val] def remove_gray(img,lower_val,upper_val): hsv = cv2.cvtColor
  • 计数齿轮(Python,OpenCV)(Count gear (Python, OpenCV))
    问题 对于原型,我需要构建齿轮的 3d 模型。 这有“许多”数量的牙齿。 所以我试图使用 OpenCV 和 Python 来计算它们。 我发现这个(仅?)帖子解释了如何在 C++ 中做到这一点。 我正在按照步骤操作,现在这是我制作的代码。 import numpy as np import cv2 img = cv2.imread('C:\\Users\\Link\\Desktop\\gear.png') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) kernel = np.ones((3, 3), np.uint8) img_erosion = cv2.erode(thresh, kernel, iterations=1) edges = cv2.Canny(img_erosion, 50, 150) img_dilate = cv2.dilate(edges, kernel, iterations=1) cv2.imshow('i', thresh) cv2.waitKey(0) cv2.imshow('i', img_erosion) cv2.waitKey(0)
  • Opencv: Crop out text areas from license
    I have the below image of a single drivers license, I want to extract information about the drivers license, name, DOB etc. My thought process is to find a way to group them line by line, and crop out the single rectangle that contains name, license, etc for eng and ara. But I have failed woefully. import cv2 import os import numpy as np scan_dir = os.path.dirname(__file__) image_dir = os.path.join(scan_dir, '../../images') class Loader(object): def __init__(self, filename, gray=True): self.filename = filename self.gray = gray self.image = None def _read(self, filename): rgba = cv2.imread(os
  • 数字图像处理——第九章 形态学图像处理
    数字图像处理——第9章 形态学图像处理 文章目录 数字图像处理——第9章 形态学图像处理1 基础知识1.1 形态学图像1.2 二值图像 2 腐蚀和膨胀2.1 腐蚀2.2 膨胀 3 开操作与闭操作3.1 开操作3.2 闭操作3.3 实验对比 4 一些基本的形态学算法4.1 边界提取4.2 空洞填充4.3 凸壳 1 基础知识 1.1 形态学图像 形态学通常指的是生物学的某个分支,常用来处理动物和植物的形状和结构。现在,我们也将这个词用于图像处理中。形态学图像处理就是使用数学形态学的基本运算,由计算机对图像进行分析,以达到所需结果的一种技术。通俗理解,形态学操作其实就是改变物体的形态。 1.2 二值图像 为啥会形态学会提到二值图像,因为形态学操作一般作用于二值图像。所以继续复习下二值图像。二值图像(Binary Image)是指将图像上的每一个像素只有两种可能的取值或灰度等级状态。具体来说,二值图像是指在图像中,灰度等级只有两种,也就是说,图像中的任何像素点的灰度值均为0或者255,分别代表黑色和白色。举个例子,首先我们需要读取一张灰度图,然后将设定一个全1的矩阵,然后设定阈值,即二值化的阈值,例如177,则原图像素值大于177的置为1,小于177则置为0。 代码如下: import cv2 import numpy as np import matplotlib.pyplot as
  • 去除图像中的虚假小噪声岛-Python OpenCV(Remove spurious small islands of noise in an image - Python OpenCV)
    问题 我正在尝试消除某些图像的背景噪音。 这是未过滤的图像。 为了进行过滤,我使用了以下代码来生成应保留在图像中的蒙版: element = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2)) mask = cv2.erode(mask, element, iterations = 1) mask = cv2.dilate(mask, element, iterations = 1) mask = cv2.erode(mask, element) 有了这段代码,当我从原始图像中屏蔽掉不需要的像素时,我得到的是: 如您所见,中间区域的所有小点都消失了,但是来自密集区域的许多小点也消失了。 为了减少过滤,我尝试将getStructuringElement()的第二个参数更改为(1,1),但是这样做使我得到第一张图像,就好像没有任何内容被过滤一样。 有什么办法可以应用这两个极端之间的过滤器? 另外,有人可以向我解释getStructuringElement()确切作用吗? 什么是“结构要素”? 它是做什么的,它的大小(第二个参数)如何影响过滤级别? 回答1 您的许多问题都来自以下事实:您不确定形态图像处理的工作方式,但是我们可以消除您的疑虑。 您可以将结构元素解释为要比较的“基本形状”。 结构元素中的1对应于您要在此形状中查看的像素
  • Why python raise a runtime error only with certain images?
    It is the third question i do in stackoverflow about that because every time i got some changes in the way python raise runtime erro. Previous questions were: here and here. In the first question i think was a matter of memory because i anylized many images, in the second case the runtime error happen at this line p2 = numpy.percentile(img, 2) and i think was a numpy module problem. but now i the runtime error happens here: imgbnbin = mh.morph.dilate(gray, disk7) At mahotas function dilate. the only three image i have among 90 images are this: and these are 2 sample images where the code works
  • 为什么python仅对某些图像引发运行时错误?(Why python raise a runtime error only with certain images?)
    问题 这是我在 stackoverflow 中做的第三个问题,因为每次我在 python 引发运行时错误的方式上有一些变化。 以前的问题是:这里和这里。 在第一个问题中,我认为是内存问题,因为我对许多图像进行了处理,在第二种情况下,运行时错误发生在这一行 p2 = numpy.percentile(img, 2) 我认为是一个 numpy 模块问题。 但现在我在这里发生运行时错误: imgbnbin = mh.morph.dilate(gray, disk7) 在 mahotas 函数膨胀。 在 90 张图片中,我仅有的三张图片是这样的: 这些是代码工作正常的 2 个示例图像: 下面是我遇到运行时错误的函数 skelfeatures 的代码: import os import glob import scipy import numpy as np import pymorph as pm import pylab as plb import matplotlib from matplotlib import pyplot as plt import cv2 import mahotas as mh from skimage import morphology from skimage import io from math import sqrt from skimage
  • How to remove horizontal and vertical lines from an image
    I have an image that is of a text written on a spiral notebook paper. the paper has horizontal lines. I would like to remove the horizontal lines from the image. While googling I found a solution that I thought would work: Extract horizontal and vertical lines by using morphological operations The solution was in C++ so I converted it to Python. It works well on the sample image provided in that solution however, it does not seem to work for my images. While running it on my image I get these results: Original Image Resulting Image Below is the Python code that I translated from C++ #cpp code
  • 如何使图像的不连续轮廓保持一致?(How could I make the discontinuous contour of an image consistant?)
    问题 在任务中,我得到了一个不连续的边缘图像,如何使它关闭? 换句话说,使曲线连续。 并且形状可以是任何类型,导致这个 coutour 阴影。 回答1 以下是一些可以帮助您入门的想法。 我不喜欢在 OpenCV 中编写和调试大量 C++ - 通常人们会问问题然后再也不登录,或者你花了几个小时做某事然后他们告诉你他们提供的单个示例图像根本没有代表性他们的实际图像和花了 25 分钟解释的方法是完全不合适的。 一种想法是形态学扩张 - 您可以在命令行中使用 ImageMagick 执行此操作: convert gappy.jpg -threshold 50% -morphology dilate disk:5 result.png 另一个想法可能是使用命中和未命中形态定位所有“线端”像素。 这在 OpenCV 中可用,但我正在使用 ImageMagick 来保存编码/调试。 结构元素是这样的: 希望您能看到第一个(最左边的)结构元素代表东西线的西端,第二个代表南北线的北端,依此类推。 如果你还没明白,最后一个是North-East to South-West line的西南端。 基本上,我找到线的末端,然后用蓝色像素扩大它们并将其覆盖到原始像素上: convert gappy.jpg -threshold 50% \ \( +clone -morphology hmt lineends
  • 将 C++ OpenCV 转换为 Python(Converting C++ OpenCV to Python)
    问题 我正在尝试从看起来像这样的图像中删除水平线和垂直线: 在谷歌搜索时,我找到了一个我认为可能有效的解决方案:使用形态学操作提取水平线和垂直线,但是,它是在 C++ 中。 我尝试将解决方案转换为 Python,但没有得到相同的结果。 为了保持图像相同,我在该解决方案中使用的同一图像上尝试了我的 python 版本: 下面是我的 python 版本,在评论中带有相关的 c++ 版本: img = cv2.imread(path) img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #// Apply adaptiveThreshold at the bitwise_not of gray, notice the ~ symbol #Mat bw; #adaptiveThreshold(~gray, bw, 255, CV_ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2); th2 = cv2.adaptiveThreshold(img,255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,15,-2) cv2.imwrite("th2.jpg", th2) #Mat horizontal = bw.clone(); #Mat vertical = bw.clone