python图像边缘opencv_图像处理中的角点检测Opencv Python

1586010002-jmsa.png

I have an image of the box. I am trying to detect corners and mark those corner from circles. I am using the following code for this:

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.THRESH_BINARY, 11, 2)

# Applying Canny Edge detection

canny_image = cv2.Canny(th,250,255)

canny_image = cv2.convertScaleAbs(canny_image)

# dilation to strengthen the edges

kernel = np.ones((3,3), np.uint8)

# Creating the kernel for dilation

dilated_image = cv2.dilate(canny_image,kernel,iterations=1)

np.set_printoptions(threshold=np.nan)

_, contours, h = cv2.findContours(dilated_image, 1, 2)

contours= sorted(contours, key = cv2.contourArea, reverse = True)[:1]

corners = cv2.goodFeaturesToTrack(thresh_image,6,0.06,25)

corners = np.float32(corners)

for item in corners:

x,y = item[0]

cv2.circle(img,(x,y),10,255,-1)

cv2.namedWindow("Corners", cv2.WINDOW_NORMAL)

cv2.imshow("Corners",img)

cv2.waitKey()

This code will return my image with pointing edges with circles but you can see that two edges (edges at the back of the box) are detected incorrectly. I know there is some problem in determining the corners because here we are just plotting the corners. Can anyone guide me where I am doing it wrong ? Thanks iQV2y.jpg

iVb2f.jpg

解决方案

I wouldn't say I have reached the best solution, but after quite a lot of coding I was able to obtain the following:

1yo1A.jpg

To obtain this I followed the following steps:

1. First: Obtain the edges of the box

I performed bilateral filtering on the grayscale image.

Found the edges using Canny edge detection.

Enhanced the edges using morphological dilation.

This is the result of the above:

vo8Dg.jpg

Now when I did Corner detection, I was not at all satisfied:

LFEyv.jpg

So what did I do?

2. Finding desired corners

I blurred the dilated image using a window of size 9x9.

Then applied Harris corner detection to this blurred image.

As a result I was able to obtain this:

1yo1A.jpg

I know it is not perfect but it can always be fine tuned.

Here is the code for corner detection:

dst = cv2.cornerHarris(dilate,2,3,0.04)

#----result is dilated for marking the corners, not important-------------

dst = cv2.dilate(dst,None)

#----Threshold for an optimal value, it may vary depending on the image---

img[dst>0.01*dst.max()]=[0,0,255]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值