如何在特定偏移处围绕图像的彩色像素绘制线条?

时间:2018-06-02 15:40:27

标签: javascript opencv image-processing

我使用opencv for Javascript来生成源图像,我将其放置在画布中'上下文来自putImageData。

我需要在距离红色约20像素的图像的红色部分周围画一条线。第二张图片就是我手绘后的图像,但希望你能得到这个想法。

简单地克隆(放入覆盖的画布)并缩放红色图像后面的图像并不起作用(缩放不是正确的方法)。我想过使用扩张但它看起来并不可靠,而且速度很慢。

Red image needs offset Goal

更新:根据评论者的要求,以下是扩张效果不佳的示例。

// Dilate the image
let src = cv.imread('canvasOffset');
let dst = new cv.Mat();
let M = cv.Mat.ones(40, 40, cv.CV_8U);
let anchor = new cv.Point(-1, -1);
cv.dilate(src, dst, M, anchor, 1, cv.BORDER_CONSTANT, 
cv.morphologyDefaultBorderValue());
cv.imshow('canvasOffset', dst);
src.delete(); dst.delete(); M.delete()

Dilation

2 个答案:

答案 0 :(得分:1)

感谢Cris Luengo,这已经解决了。

我能够将OpenCV的扩张与椭圆结构元素一起使用。它完全符合我的需要。

给定包含原始图像的“canvasOffset”画布:

let src = cv.imread('canvasOffset');
let dst = new cv.Mat();
let M = new cv.Mat();
let ksize = new cv.Size(25, 25);
M = cv.getStructuringElement(cv.MORPH_ELLIPSE, ksize);
let anchor = new cv.Point(-1, -1);
cv.dilate(src, dst, M, anchor, 1, cv.BORDER_CONSTANT, cv.morphologyDefaultBorderValue());
cv.imshow('canvasOffset', dst);

结果:

enter image description here

答案 1 :(得分:0)

我有一个用Python实现的简单解决方案。

  1. 首先,我将给定的图像转换为二进制图像,其中红色对象是感兴趣的区域(白色)
  2. enter image description here

    1. 接下来,我使用OpenCV中提供的内置功能找到了轮廓。我在另一个图像上绘制了带有粗边框的结果轮廓,其中黑色像素与原始图像具有相同的形状。
    2. enter image description here

      1. 我在这张黑色图像上找到了轮廓,并在原始图像上绘制了轮廓。这次我画的轮廓没有厚度。
      2. enter image description here

        (正如我所说,代码是用python编写的,如果你想让我分享的话)

        import cv2
        import numpy as np
        import os
        
        path = r'C:\Users\Desktop\Stack\contour'
        im = cv2.imread(os.path.join(path, 'handle.jpg'))
        im = cv2.resize(im, (0, 0), fx=0.5, fy=0.5)         #--- resizing the image
        im2 = im.copy()    #--- having another copy of the original image                       
        
        imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
        ret2, th2 = cv2.threshold(imgray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
        cv2.imshow('th2.jpg', th2)     #--- Image 1
        
        _, contours, hierarchy = cv2.findContours(th2, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        cnt = contours[0]
        
        mask = np.zeros_like(im)
        cv2.drawContours(mask, contours, -1, (255, 255, 255), 33)
        cv2.imshow('mask.jpg', mask)    #--- Image 2
        
        ret2, mask_th2 = cv2.threshold(mask[:,:,1], 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
        _, contours1, hierarchy = cv2.findContours(mask_th2, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        cv2.drawContours(im2, contours1, -1, (0, 0, 0), 2)
        cv2.imshow('final.jpg', im2)    #--- Image 3
        
        cv2.waitKey(0)
        cv2.destroyAllWindows()