为什么自适应阈值图像比原始图像小?
Why is adaptive threshold image smaller than the original?
我正在尝试在最终将用于形状检测的直播流中使用 adapativeThreshold。常规阈值不足以显示我想看到的内容。当我使用下面的代码时,常规阈值按预期出现,但由于某种原因自适应阈值比原始阈值薄得多,我在视图中看不到任何东西。好像有什么事发生了,但我说不上来。关于如何使自适应阈值 windows 全尺寸有什么想法吗?
这是我在 运行 每个 window 中的程序时看到的:
#import packages
from documentscanner.pyimagesearch.transform import four_point_transform
from pyimagesearch.shapedetector import ShapeDetector
from skimage.filters import threshold_local
import numpy as np
import cv2
import imutils
def draw_Contours(screen, points):
cv2.drawContours(screen, [points], -1, (0, 255, 0), 2)
cv2.imshow("Outline", screen)
def nothing(x):
#any operation
pass
#access video camera
cap = cv2.VideoCapture(0)
cv2.namedWindow('Trackbars')
cv2.createTrackbar('min_edge', 'Trackbars', 75, 100, nothing)
cv2.createTrackbar('max_edge', 'Trackbars', 110,300, nothing)
while True:
_, frame = cap.read() #read video camera data
minedge = cv2.getTrackbarPos('min_edge', 'Trackbars')
maxedge = cv2.getTrackbarPos('max_edge', 'Trackbars')
#convert image to gray scale
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
#blur = cv2.GaussianBlur(frame, (5, 5), 0)
#edged = cv2.Canny(gray, minedge, maxedge)
#threshhold instead of edging
thresh = cv2.threshold(gray, 60, 255, cv2.THRESH_BINARY)[1]
thresh2 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY, 11, 2)[1]
thresh3 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C,\
cv2.THRESH_BINARY, 11, 2)[1]
#find contours in edges image, keeping the largest ones, and initialize the screen contour/shapedetect
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
sd = ShapeDetector()
cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:5]
#loop over contours
for c in cnts:
#approximate the contour points
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.02*peri, True)
#check points in contour
if len(approx) == 4:
print("rectangle found: ")
print(approx)
draw_Contours(frame, approx)
if len(approx) == 3:
print("triangle found: ")
print(approx)
draw_Contours(frame, approx)
if len(approx) == 2:
print("line found: ")
print(approx)
draw_Contours(frame, approx)
#show the countour(outline) of the shapes
#show original frame and gray frame
cv2.imshow('Frame', frame)
#cv2.imshow('Copy', gray)
#cv2.imshow('Edged', edged)
cv2.imshow('Threshold', thresh)
cv2.imshow('ThresholdGaussian', thresh2)
cv2.imshow('ThresholdMean', thresh3)
#detect key press and exit with escape key
key = cv2.waitKey(1)
if key == 27:
break
#close the program
cap.release()
cv2.destroyAllWindows()
而不是使用
thresh2 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY, 11, 2)[1]
thresh3 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C,\
cv2.THRESH_BINARY, 11, 2)[1]
在没有numpy索引的情况下使用它就不会出现这个错误。
thresh2 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY, 11, 2) # don't use [1]
thresh3 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C,\
cv2.THRESH_BINARY, 11, 2)
这是因为正常阈值 returns 两个值,而自适应阈值 returns 只有一个值。
我正在尝试在最终将用于形状检测的直播流中使用 adapativeThreshold。常规阈值不足以显示我想看到的内容。当我使用下面的代码时,常规阈值按预期出现,但由于某种原因自适应阈值比原始阈值薄得多,我在视图中看不到任何东西。好像有什么事发生了,但我说不上来。关于如何使自适应阈值 windows 全尺寸有什么想法吗?
这是我在 运行 每个 window 中的程序时看到的:
#import packages
from documentscanner.pyimagesearch.transform import four_point_transform
from pyimagesearch.shapedetector import ShapeDetector
from skimage.filters import threshold_local
import numpy as np
import cv2
import imutils
def draw_Contours(screen, points):
cv2.drawContours(screen, [points], -1, (0, 255, 0), 2)
cv2.imshow("Outline", screen)
def nothing(x):
#any operation
pass
#access video camera
cap = cv2.VideoCapture(0)
cv2.namedWindow('Trackbars')
cv2.createTrackbar('min_edge', 'Trackbars', 75, 100, nothing)
cv2.createTrackbar('max_edge', 'Trackbars', 110,300, nothing)
while True:
_, frame = cap.read() #read video camera data
minedge = cv2.getTrackbarPos('min_edge', 'Trackbars')
maxedge = cv2.getTrackbarPos('max_edge', 'Trackbars')
#convert image to gray scale
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
#blur = cv2.GaussianBlur(frame, (5, 5), 0)
#edged = cv2.Canny(gray, minedge, maxedge)
#threshhold instead of edging
thresh = cv2.threshold(gray, 60, 255, cv2.THRESH_BINARY)[1]
thresh2 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY, 11, 2)[1]
thresh3 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C,\
cv2.THRESH_BINARY, 11, 2)[1]
#find contours in edges image, keeping the largest ones, and initialize the screen contour/shapedetect
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
sd = ShapeDetector()
cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:5]
#loop over contours
for c in cnts:
#approximate the contour points
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.02*peri, True)
#check points in contour
if len(approx) == 4:
print("rectangle found: ")
print(approx)
draw_Contours(frame, approx)
if len(approx) == 3:
print("triangle found: ")
print(approx)
draw_Contours(frame, approx)
if len(approx) == 2:
print("line found: ")
print(approx)
draw_Contours(frame, approx)
#show the countour(outline) of the shapes
#show original frame and gray frame
cv2.imshow('Frame', frame)
#cv2.imshow('Copy', gray)
#cv2.imshow('Edged', edged)
cv2.imshow('Threshold', thresh)
cv2.imshow('ThresholdGaussian', thresh2)
cv2.imshow('ThresholdMean', thresh3)
#detect key press and exit with escape key
key = cv2.waitKey(1)
if key == 27:
break
#close the program
cap.release()
cv2.destroyAllWindows()
而不是使用
thresh2 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY, 11, 2)[1]
thresh3 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C,\
cv2.THRESH_BINARY, 11, 2)[1]
在没有numpy索引的情况下使用它就不会出现这个错误。
thresh2 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY, 11, 2) # don't use [1]
thresh3 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C,\
cv2.THRESH_BINARY, 11, 2)
这是因为正常阈值 returns 两个值,而自适应阈值 returns 只有一个值。