Как убрать шум на оригинальном изображении с помощью opencv - PullRequest
1 голос
/ 19 сентября 2019

Я пытаюсь отсканировать рабочую область в моем Проекте, используя OpenCV, который находится в форме шахматной доски.Чтобы сделать это, я предпринял следующие шаги, также упомянутые на следующем веб-сайте

Код Для сканирования документа

  1. Обнаружение кромок
  2. Использованиекрая на изображении, чтобы найти контур, представляющий границу рабочего места
  3. Применить перспективное преобразование, чтобы получить вид сверху на рабочее место

Но полученный результат находится в искаженном видеи это из-за шума на оригинальном снимке, который я сделал с камеры.

Итак, есть ли какой-либо способ устранить шум в исходном изображении из-за камеры, чтобы в итоге я получил неискаженный вывод.

Под неискаженным выводом я подразумеваю рабочее место в черно-белом виде.коробки, как у нас в шахматной доске.

На ваше рассмотрение я также прилагаю следующие вещи

a) Исходное изображение, которое я использовал для обработки б) Выходное изображение, которое я получаю после полной обработки

Фрагмент кода, который я использовал

image = cv2.imread(arg["image"])
(h, w, d) = image.shape

#Resize image 
ratio = image.shape[0]/500.0
orig = image.copy()
image = imutils.resize(image,height = 500)

#Find edge, blur it
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)   
gray = cv2.GaussianBlur(gray,(3,3),0)
edged = cv2.Canny(gray,75,200)


# find the contours in the edged image, keeping only the 
# largest ones, and initialize the screen contour
cnts = cv2.findContours(edged.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
cnts = sorted(cnts,key = cv2.contourArea, reverse = True)[:5] 

#loop over the contours 
for c in cnts: 
    #approximate the contour
    peri = cv2.arcLength(c,True)
    approx = cv2.approxPolyDP(c,0.02*peri, True)

    #if our approximated contour has four points, then we
    # can assume that we have found our screen 
    if len(approx) == 4:
        screenCnt = approx
        break
# show the contour (outline) of the piece of paper

cv2.drawContours(image,[screenCnt],-1,(0,255),2)
cv2.imshow("Outline",image)

#apply the four point transform to obtain a top-down 
#view of original image 
warped = four_point_transform(orig,screenCnt.reshape(4,2)*ratio)

#convert the wrapped image to grayscle, then threshold it 
#to give it that 'black and white ' paper effect
warped = cv2.cvtColor(warped,cv2.COLOR_BGR2GRAY)
T = threshold_local(warped,11,offset =10,method = "gaussian")
warped = (warped >T).astype("uint8")*255

#show the original and scanned images
print("STEP3: Apply perspective transform")
cv2.imshow("Original",imutils.resize(orig,height=650))
cv2.imshow("Scanned",imutils.resize(warped,height=650))
cv2.imwrite("OutputImage.png",imutils.resize(warped,height=650))

Пожалуйста, сообщите мне, если вам нужна какая-либо другая информация.

Большое спасибо:)

Исходное изображение

Original Image

Выходное изображение после обработки

Output Image After Processing

1 Ответ

1 голос
/ 23 сентября 2019

Это не шум, это псевдоним, созданный потому, что ваше разрешение слишком мало по сравнению с квадратами, которые вы хотите обнаружить.Увеличьте размер ваших квадратов или разрешение вашей камеры.Вы должны следовать Nyquist Rate , размер вашего пикселя должен быть не менее половины квадрата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...