OpenCV python Stamp filter photoshop

匿名 (未验证) 提交于 2019-12-03 09:05:37

问题:

I am new to opencv. I have multiple images. One of sample image as shown below at top left corner. Basically I want to separate background and foreground so that edges are clear and I can detect contours properly.

I have tried many filter and of course thresholds using various parameters.

Finally when I was looking on photoshop filters gallery I noticed a filter called Stamp which is giving me desired result(top-right corner). It makes edges clear and I guess use some amount of blur to soft corners.

I am not sure how I can obtain same operation as photoshop's stamp filter using python CV2?

Any help or suggestions will be grateful.

Original Untouched Image

Attempt 1: -- Code

import cv2 import numpy as np from matplotlib import pyplot as plt  input_img = cv2.imread('images/Tas/t3.bmp') desired_img = cv2.imread('images/stamp.jpg')  # gray scale gray = cv2.cvtColor(input_img, cv2.COLOR_BGR2GRAY)  kernel = np.ones((3,3),np.uint8)  thresh1 = cv2.threshold(input_img,80,255,cv2.THRESH_BINARY)[1] erosion1 = cv2.erode(thresh1,kernel,iterations = 1) dilation1 = cv2.dilate(erosion1,kernel,iterations = 1)  thresh2 = cv2.threshold(input_img,120,255,cv2.THRESH_BINARY)[1] erosion2 = cv2.erode(thresh2,kernel,iterations = 1) dilation2 = cv2.dilate(erosion2,kernel,iterations = 1)  titles = ['Original', 'Desired','thresh1', 'erosion1','dilation1','thresh2','erosion2','dilation2'] images = [input_img, desired_img, thresh1, erosion1,dilation1, thresh2,erosion2, dilation2] for i in xrange(8):   plt.subplot(2,4,i+1),plt.imshow(images[i])   plt.title(titles[i])   plt.xticks([]),plt.yticks([])  plt.show() 

Output:

回答1:

It might help to add yourself a couple of sliders for Gaussian Blur and Threshold filtering and you can get pretty decent results:

and here's the basic snippet I used to generate it:

import numpy as np import cv2 import cv2.cv as cv from matplotlib import pyplot as plt  # slider callbacks def printThreshold(x):     print "threshold",x def printGaussianBlur(x):     print "gaussian blur kernel size",x # make a window to add sliders/preview to cv2.namedWindow('processed') #make some sliders cv2.createTrackbar('threshold','processed',60,255,printThreshold) cv2.createTrackbar('gaussian blur','processed',3,10,printGaussianBlur) # load image img = cv2.imread('cQMgT.png',0) # continously process for quick feedback while 1:     # exit on ESC key     k = cv2.waitKey(1) & 0xFF     if k == 27:         break      # Gaussian Blur ( x2 +1 = odd number for kernel size)     kernelSize = ((cv2.getTrackbarPos('gaussian blur','processed') * 2) + 1)     blur = cv2.GaussianBlur(img,(kernelSize,kernelSize),0)     # Threshold     ret,thresh = cv2.threshold(blur,cv2.getTrackbarPos('threshold','processed',),255,0)     # show result     cv2.imshow('processed ',thresh)  # exit cv2.destroyAllWindows() 

Feel free to add other filters to the mix and experiment with sliders.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!