我有一个从现场网络摄像头拍摄的图像,我希望能够检测图像中的特定对象并提取其中的一部分以进行进一步处理.
具体来说,图像将是一个游戏板,让我们说这个问题的目的是它是一个数独游戏板.
我最初的方法是寻找对比区域,并从那里开始研究,但我似乎最终有很多潜在的边缘(很多错误),并没有真正的线索,如何找出哪些是我真正想要的!
是否有任何算法,库,代码示例,甚至是那些明智的想法,关于我如何寻找和提取图像的相关部分?
我想询问有关如何使用倒角匹配算法(边缘匹配算法)来查找"相似"图像的更多信息.我想知道是否可以为匹配的结果设置"得分".
我想提取手的边缘,但我得到以下结果.我已经尝试调整低和高阈值,但我仍然无法获得所需的输出.我在下面列出了代码及其输出.什么似乎是问题?
这是由下面的代码生成的输出图像.
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
int main(){
cv::Mat image= cv::imread("open_1a.jpg");
cv::Mat contours;
cv::Mat gray_image;
cvtColor( image, gray_image, CV_RGB2GRAY );
cv::Canny(image,contours,10,350);
cv::namedWindow("Image");
cv::imshow("Image",image);
cv::namedWindow("Gray");
cv::imshow("Gray",gray_image);
cv::namedWindow("Canny");
cv::imshow("Canny",contours);
cv::waitKey(0);
}
Run Code Online (Sandbox Code Playgroud) 我想提取图像的轮廓,表示为一系列点坐标.
随着Canny我能够产生包含图像的只有边缘的二值图像.然后,我试图findContours用来提取轮廓.但结果并不好.
对于每个边缘,我经常得到2条线,就像它被认为是一个非常薄的区域.我想简化我的轮廓,以便我可以将它们画成单行.或者可以用不同的函数提取它们,直接产生正确的结果会更好.
我看了一下OpenCV的文档,但我找不到任何有用的东西,但我想我不是第一个遇到类似问题的人.我可以使用任何功能或方法吗?
这是我到目前为止编写的Python代码:
def main():
img = cv2.imread("lena-mono.png", 0)
if img is None:
raise Exception("Error while loading the image")
canny_img = cv2.Canny(img, 80, 150)
contours, hierarchy = cv2.findContours(canny_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
contours_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
scale = 10
contours_img = cv2.resize(contours_img, (0, 0), fx=scale, fy=scale)
for cnt in contours:
color = np.random.randint(0, 255, (3)).tolist()
cv2.drawContours(contours_img,[cnt*scale], 0, color, 1)
cv2.imwrite("canny.png", canny_img)
cv2.imwrite("contours.png", contours_img)
Run Code Online (Sandbox Code Playgroud)
比例因子用于突出轮廓的双线.以下是图片的链接:
任何建议将不胜感激.
opencv feature-extraction contour computer-vision edge-detection
我正在使用canny边缘检测和查找轮廓功能(两个OpenCV)来创建分水岭变换的标记.一切正常,但我对结果并不是百分之百满意.原因是缺少一些边缘,因此丢失了重要信息.更详细的说,我得到了一堆窗口(前视图),它们是矩形,在分水岭变换之后,我最终得到了这样的结果:
但我宁愿有漂亮的矩形,这些矩形是完整的,不向一边开放.同时保持不规则的形状(房子前面的灌木,汽车..)任何想法如何解决这个问题?我想用网格覆盖整个图像,但我不能让它工作.
非常感谢你.
这是我的代码:
Mat gray;
cvtColor(im, gray, CV_BGR2GRAY);
// Use Canny instead of threshold to catch squares with gradient shading
Mat bw;
Canny(gray, bw, 0, 100, 5, true);
// Find contours
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours( bw, contours, hierarchy,
CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
// watershed
Mat markers(bw.size(), CV_32S);
markers = Scalar::all(0);
int idx = 0;
int compCount = 0;
for( ; idx >= 0; idx = hierarchy[idx][0], compCount++ ) {
if (fabs(contourArea(contours[compCount])) < min_size )
continue;
drawContours(markers, contours, idx, …Run Code Online (Sandbox Code Playgroud) 我想编制一张长方形纸张的检测,这张纸在每一面都不一定要完全笔直,因为我可以"在空中"拍摄它,这意味着纸张的单面可能会得到扭曲了一下.
应用程序(iOs和android)CamScanner非常好,我想知道如何实现它.首先我想到了:
但这给了我很多不同类型图像的问题.我想知道是否有更好的方法直接检测图像中的矩形形状,如果是这样,如果camscanner也可以像这样实现它!?
以下是CamScanner中拍摄的一些图像.即使在a)侧面扭曲(但是角落仍然显示在叠加层中,但并不真正适合白纸的角落),并且在b)背景非常接近实际纸张但这些都被很好地检测到了它仍然被正确识别:

它甚至可以正确获取旋转的图片:

当我插入一些测试错误时,它会失败但至少检测到一些轮廓,但总是尝试将其检测为矩形:

在这里它完全失败了:

我想在最后三个例子中,如果它会进行霍夫变换,它可能已经检测到矩形的四个边中的至少两个.
有什么想法和提示吗?非常感谢提前
image image-processing rectangles edge-detection hough-transform
我是图像处理的新手,我试图用这个代码检测垂直线 -
image=imread('benzene.jpg');
BW = im2bw(image);
w1=[-1 2 -1 ; -1 2 -1 ; -1 2 -1];
g=(imfilter(double(BW),w1));
g=abs(g);
T=max(g(:));
g=g>=T;
imshow(g);
Run Code Online (Sandbox Code Playgroud)
这是我的形象 -

这是我在执行操作后得到的 -

所以我的问题是为什么我得到这个输出?如果垂直双键被算作2条不同的垂直线,那么有10条垂直线.如果我想要获得水平,垂直,45和-45所有线条,我该怎么办?使用所有4个掩码来获得一个输出?
matlab image image-processing computer-vision edge-detection
我想按照机器人后面的一行跟随下图中最右边的边缘.
我尝试过简单的"阈值处理",但不幸的是,它包含了模糊的白色光环:
我阈值的原因是从Sobel边缘探测器获得一条干净的线:
有没有一个好的算法可以用来隔离这个边缘/沿着这个边缘移动?我目前使用的那个似乎容易出错,但它是迄今为止我能够弄清楚的最好的一个.
注意:边缘可能在任何方向上弯曲或对齐,但边缘上的点始终非常靠近图像的中心.这是我正在尝试做的视频.由于光晕拧紧了阈值,它在(1:35)之后不会跟随边缘.
这是另一个例子:
在这里,我将中心边缘填充,将其与右下角的小凹凸分开:
我正在尝试使用Python和OpenCV对视网膜图像中的血管进行分割.这是原始图像:
理想情况下,我希望所有的血管都像这样(不同的图像)非常明显:
这是我到目前为止所尝试的.我拍了图像的绿色通道.
img = cv2.imread('images/HealthyEyeFundus.jpg')
b,g,r = cv2.split(img)
Run Code Online (Sandbox Code Playgroud)
然后我试图按照创建匹配滤波器这篇文章,这是输出图像是什么:
然后我尝试进行最大熵阈值处理:
def max_entropy(data):
# calculate CDF (cumulative density function)
cdf = data.astype(np.float).cumsum()
# find histogram's nonzero area
valid_idx = np.nonzero(data)[0]
first_bin = valid_idx[0]
last_bin = valid_idx[-1]
# initialize search for maximum
max_ent, threshold = 0, 0
for it in range(first_bin, last_bin + 1):
# Background (dark)
hist_range = data[:it + 1]
hist_range = hist_range[hist_range != 0] / cdf[it] # normalize within selected range & remove all 0 elements …Run Code Online (Sandbox Code Playgroud) 作为我正在为Android开发的应用程序的一部分,我想向用户展示他们拍摄的图像的边缘检测版本(类似于下面的示例).
为实现这一目标,我一直在研究Sobel运算符以及如何在Java中实现它.但是,我发现的许多示例都使用AWT中的对象和方法(如本例所示),而不是Android的一部分.
那么我的问题是,Android是否提供了上述示例中使用的AWT功能的替代方案?如果我们仅使用Android内置的库重写该示例,我们将如何进行呢?