标签: edge-detection

如何为多边形逼近确定cvCanny的最佳参数

这是我的源图像(忽略点,稍后手动添加):

在此输入图像描述

我的目标是获得两只手的粗略多边形近似.像这样的东西:

在此输入图像描述

我对如何做到这一点有一个大概的想法; 我想用来cvCanny找到边缘,cvFindContours找到轮廓,然后cvApproxPoly.

我面临的问题是我不知道如何正确使用cvCanny,特别是我应该使用什么来处理最后3个参数(threshold1&2,apertureSize)?我试过做:

cvCanny(source, cannyProcessedImage, 20, 40, 3);
Run Code Online (Sandbox Code Playgroud)

但结果并不理想.左手看起来相对较好,但右手检测得很少:

在此输入图像描述

一般来说,它不像我想的那么可靠.有没有办法猜测Canny的"最佳"参数,或者至少是一个详细的解释(初学者可以理解)他们做了什么,所以我可以做出有根据的猜测?或者也许有更好的方法来完成这项工作?

c opencv computer-vision edge-detection feature-detection

1
推荐指数
1
解决办法
3598
查看次数

来自fspecial的sobel面具是否找到水平或垂直边缘?

所以我在Matlab中做了类似的事情:

s = fspecial('sobel');
imshow(conv2(image, s));
Run Code Online (Sandbox Code Playgroud)

在matlab中,当我创建一个sobel蒙fspecial版并conv2在图像上使用该蒙版时,复杂图像中的边缘是水平边缘还是垂直边缘还是已经添加了水平和垂直边缘?对角边缘怎么样?

matlab image-processing edge-detection

1
推荐指数
1
解决办法
6375
查看次数

边缘检测/角度

我可以成功地对图像进行阈值处理并在图像中找到边缘。我正在努力尝试准确提取黑边的角度。

我目前正在获取黑色边缘的极值点并使用 atan2 函数计算角度,但由于混叠,根据您选择的点,角度可能会出现一定程度的变化。是否有一种可靠的可编程方式来选择计算角度的点?

示例图像:

摇摇欲坠的棋盘

例如,Gimp Measure 工具角度为 3.12°,

Gimp 测量工具

c++ signal-processing image-processing edge-detection

1
推荐指数
1
解决办法
2814
查看次数

使用 Imagemagick 复制 Photoshop 的“扩展选择”功能

我正在寻找使用 Imagemagick (通过 PHP)来处理具有透明背景和一些半透明像素(如渐变)的 PNG。图像必须像这样进行更改: 1. 将所有非透明像素设置为相同的纯色(黑色即可)
2. 将图像内形状的边缘扩展 25 个像素

使用此输入(透明 BG,某些像素是半透明的):
输入PNG

我期望这样的输出:
输出 PNG

这不仅仅是调整图像大小。我正在寻找类似于 Photoshop 扩展选区的功能(例如,顶部圆圈中的间隙被否定,因为它小于 25 像素扩展)。

目前,我有一些代码可以扫描图像并查找边缘,但当图像中存在多个未连接的形状时,就会失败。Imagemagick 是否有办法做到这一点,或者是否有一种算法可以用来扫描图像并生成我需要的输出?速度一个问题,但只要它有效,我就可以接受缓慢的解决方案。

php image imagemagick edge-detection

1
推荐指数
1
解决办法
502
查看次数

OpenCV - 找到对象形状

我正在学习OpenCV,我已经达到了无论我做什么,我都被困住了.我想要做的是将一个对象(矩形对象)与其背景隔离开来.

一个例子是下面的电池图片: 电池图象

我想掩盖该图像,以便剩下的唯一东西就是对象.

我尝试过以下方法:

  • 阈值
  • 使用Canny检测边缘
  • 查找轮廓
  • 获得更大的一个

但我得到一些奇怪的区域作为更大的区域.以下是结果图片:

  • 谨慎的 精明的边缘

  • 最大的轮廓 在此输入图像描述

这是我正在使用的代码:

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>

using namespace cv;
using namespace std;


int main( int, char** argv )
{
Mat src, srcGray,srcBlur,srcCanny;

string file = "samsung";
src = imread(file + ".jpg");
cvtColor(src, srcGray, CV_BGR2GRAY);
//bilateralFilter(srcGray, srcBlur,11, 17, 17);
srcBlur = srcGray.clone();
imshow("Filtered", srcBlur);
imwrite(file+"-filtered.jpg",srcBlur);

Canny(srcBlur, srcCanny, 0, 100, 3, true);
imshow("Canny", srcCanny);
imwrite(file+"-canny.jpg",srcCanny);


vector< vector <Point> > contours; // Vector for storing contour
vector< Vec4i > …
Run Code Online (Sandbox Code Playgroud)

c++ opencv object-detection edge-detection canny-operator

1
推荐指数
1
解决办法
2302
查看次数

对背景较浅的图像进行伽马校正

我正在尝试使用下面的代码检测图像中身份证的边界。关键是我使用的 gamma 值。我使用 2 或 3 的值(假设我希望卡片在背景中脱颖而出)。我在使用背景较浅或与卡片颜色本身一样浅的照片时遇到问题。请看看下面的图片..第一个是带有深色b/g的原稿,第二个是带有伽玛校正的..与接下来的2个相同。我在我的智慧尽头试图弄清楚我该怎么做处理背景较浅的图片。还粘贴我用来执行伽马校正的代码。请让我知道你们是否可以将我的粗头指向正确的方向:)

import cv2
import numpy as np
import imutils
import math
import sys

img = cv2.imread( sys.argv[1] )
gray1 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
invGamma = 3.0
table = np.array([((i / 255.0) ** invGamma) * 255
for i in np.arange(0, 256)]).astype("uint8")

gray = cv2.LUT(gray1, table)
ret,thresh1 = cv2.threshold( gray, 80, 255, cv2.THRESH_BINARY )
cv2.imwrite( 'LUT.jpg', thresh1 )
_, contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
Run Code Online (Sandbox Code Playgroud)

图片1

Image1-Gamma-corrected-3

图片2

Image2-Gamma-3

python opencv image-processing edge-detection

1
推荐指数
1
解决办法
3188
查看次数

cv :: Canny抛出不匹配/不支持的格式异常

我正在做一些非常基本的边缘检测.我的部分实现涉及从自定义Image类复制到cv :: Mat,然后复制回Image.我正在使用这篇文章作为我的指南,用于完成边缘检测和轮廓工作(未在当前列表中显示).在此示例中,PerturbedBorderFilter子类为Image.这是我有的:

void PerturbedBorderFilter::performFilter(const Image& src)
{
  int h = src.Height(), w = src.Width();
  cv::Mat
    orig(h, w, CV_32FC3),
    cannyOutput(h,w,CV_32FC1),
    origGray(h,w,CV_32FC1);

  src.copyTo(orig);

  cv::cvtColor(orig, origGray, CV_RGB2GRAY);
  cv::blur(origGray, origGray, cv::Size(3,3));
  cv::Canny( origGray, cannyOutput, 0.1, 0.2, 3);

  copyFrom(cannyOutput);
}
Run Code Online (Sandbox Code Playgroud)

我最终得到了这个运行时错误:

OpenCV Error: Unsupported format or combination of formats () in cvCanny, file /build/buildd/opencv-2.3.1/modules/imgproc/src/canny.cpp, line 67
terminate called after throwing an instance of 'cv::Exception'
  what():  /build/buildd/opencv-2.3.1/modules/imgproc/src/canny.cpp:67: error: (-210)  in function cvCanny
Run Code Online (Sandbox Code Playgroud)

据我所知,'origGray'和'cannyOutput'共享相同的类型,深度和频道数.我不确定我还应该检查什么.

如果以某种方式c​​opyTo()和copyFrom()的实现很重要,我也可以给它们.

一些其他信息:

  1. Class Image的原生颜色空间是RGB,32位浮点深度,值为[0,1].
  2. 目前,copyTo()将图像上下颠倒复制,否则完整.我认为这必须是无关的,但谁知道,也许它是有用的......

opencv edge-detection

0
推荐指数
1
解决办法
2144
查看次数

如何提高sobel边缘检测器的效率

我正在用Python从头开始编写计算机视觉库,以与rpi相机配合使用。目前,我已经实现了转换为greyscale以及其他一些基本img操作,它们在我的上都运行得相对较快model B rpi3

但是,我的使用sobel运算符的边缘检测功能(维基百科描述)比其他功能慢很多,尽管它确实起作用。这里是:

def sobel(img):
    xKernel = np.array([[-1,0,1],[-2,0,2],[-1,0,1]])
    yKernel = np.array([[-1,-2,-1],[0,0,0],[1,2,1]])
    sobelled = np.zeros((img.shape[0]-2, img.shape[1]-2, 3), dtype="uint8")
    for y in range(1, img.shape[0]-1):
        for x in range(1, img.shape[1]-1):
            gx = np.sum(np.multiply(img[y-1:y+2, x-1:x+2], xKernel))
            gy = np.sum(np.multiply(img[y-1:y+2, x-1:x+2], yKernel))
            g = abs(gx) + abs(gy) #math.sqrt(gx ** 2 + gy ** 2) (Slower)
            g = g if g > 0 and g < 255 else (0 if g …
Run Code Online (Sandbox Code Playgroud)

python performance numpy edge-detection sobel

0
推荐指数
1
解决办法
1794
查看次数

在python中对二进制图像进行边缘检测的方法是什么?

我有一个二进制图像[0,1]。我想使用Python查找图像的边缘。我在二进制文件上尝试了sobel方法,但结果不佳。我希望输出像图片一样 在此处输入图片说明

image-processing edge-detection python-3.x

-1
推荐指数
1
解决办法
431
查看次数

如何在MATLAB中检测此图片中某个角度下物体的尺寸?

我有这个电池的图像:

在此输入图像描述

我想确定电池的尺寸(以像素为单位).
我遇到的问题是电池旋转了一个未知的角度.
如何检测此旋转电池的尺寸?

我在考虑这些算法步骤:

  • 首先,我必须将此图像转换为黑白图像(阈值处理).
  • 之后,我必须找到一个中心点并在白色像素中绘制一个矩形.
  • 然后,我必须将矩形旋转360度并找到矩形的位置(以及尺寸).

我有点缺乏经验,我很感激如何在Matlab中实现这些算法阶段.

谢谢

matlab image-processing computer-vision edge-detection image-segmentation

-9
推荐指数
1
解决办法
2015
查看次数