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

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

我对如何做到这一点有一个大概的想法; 我想用来cvCanny找到边缘,cvFindContours找到轮廓,然后cvApproxPoly.
我面临的问题是我不知道如何正确使用cvCanny,特别是我应该使用什么来处理最后3个参数(threshold1&2,apertureSize)?我试过做:
cvCanny(source, cannyProcessedImage, 20, 40, 3);
Run Code Online (Sandbox Code Playgroud)
但结果并不理想.左手看起来相对较好,但右手检测得很少:

一般来说,它不像我想的那么可靠.有没有办法猜测Canny的"最佳"参数,或者至少是一个详细的解释(初学者可以理解)他们做了什么,所以我可以做出有根据的猜测?或者也许有更好的方法来完成这项工作?
所以我在Matlab中做了类似的事情:
s = fspecial('sobel');
imshow(conv2(image, s));
Run Code Online (Sandbox Code Playgroud)
在matlab中,当我创建一个sobel蒙fspecial版并conv2在图像上使用该蒙版时,复杂图像中的边缘是水平边缘还是垂直边缘还是已经添加了水平和垂直边缘?对角边缘怎么样?
我可以成功地对图像进行阈值处理并在图像中找到边缘。我正在努力尝试准确提取黑边的角度。
我目前正在获取黑色边缘的极值点并使用 atan2 函数计算角度,但由于混叠,根据您选择的点,角度可能会出现一定程度的变化。是否有一种可靠的可编程方式来选择计算角度的点?
示例图像:

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

我正在寻找使用 Imagemagick (通过 PHP)来处理具有透明背景和一些半透明像素(如渐变)的 PNG。图像必须像这样进行更改: 1. 将所有非透明像素设置为相同的纯色(黑色即可)
2. 将图像内形状的边缘扩展 25 个像素
这不仅仅是调整图像大小。我正在寻找类似于 Photoshop 扩展选区的功能(例如,顶部圆圈中的间隙被否定,因为它小于 25 像素扩展)。
目前,我有一些代码可以扫描图像并查找边缘,但当图像中存在多个未连接的形状时,就会失败。Imagemagick 是否有办法做到这一点,或者是否有一种算法可以用来扫描图像并生成我需要的输出?速度是一个问题,但只要它有效,我就可以接受缓慢的解决方案。
我正在学习OpenCV,我已经达到了无论我做什么,我都被困住了.我想要做的是将一个对象(矩形对象)与其背景隔离开来.
我想掩盖该图像,以便剩下的唯一东西就是对象.
我尝试过以下方法:
但我得到一些奇怪的区域作为更大的区域.以下是结果图片:
这是我正在使用的代码:
#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) 我正在尝试使用下面的代码检测图像中身份证的边界。关键是我使用的 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)
我正在做一些非常基本的边缘检测.我的部分实现涉及从自定义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'共享相同的类型,深度和频道数.我不确定我还应该检查什么.
如果以某种方式copyTo()和copyFrom()的实现很重要,我也可以给它们.
一些其他信息:
我正在用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) 我有这个电池的图像:

我想确定电池的尺寸(以像素为单位).
我遇到的问题是电池旋转了一个未知的角度.
如何检测此旋转电池的尺寸?
我在考虑这些算法步骤:
我有点缺乏经验,我很感激如何在Matlab中实现这些算法阶段.
谢谢
matlab image-processing computer-vision edge-detection image-segmentation
edge-detection ×10
opencv ×4
c++ ×2
matlab ×2
python ×2
c ×1
image ×1
imagemagick ×1
numpy ×1
performance ×1
php ×1
python-3.x ×1
sobel ×1