问题描述
我在二进制图像上使用了Projection Profile
方法来获取去歪斜版本。一切都很好,但旋转的图像上有黑色区域已应用了偏移校正。 如何将该区域转换为白色而不是黑色。下面是Projection Profile的代码。
def correct_skew(image,delta=1,limit=5):
"""
image : input
delta : sampling in the -limit,limit + delta range
limit : range of angles to explore
"""
# Function that returns the score of histogram for the given angle at which we check
def determine_score(arr,angle):
"""
arr : binarized image
angle : angle at which we calcuate the score
"""
data = inter.rotate(arr,angle,reshape=False,order=0)
histogram = np.sum(data,axis=1)
score = np.sum((histogram[1:] - histogram[:-1]) ** 2)
return histogram,score
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray,255,cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
scores = []
angles = np.arange(-limit,limit + delta,delta)
for angle in angles:
histogram,score = determine_score(thresh,angle)
scores.append(score)
best_angle = angles[scores.index(max(scores))]
(h,w) = image.shape[:2]
center = (w // 2,h // 2)
M = cv2.getRotationMatrix2D(center,best_angle,1.0)
rotated = cv2.warpAffine(image,M,(w,h),flags=cv2.INTER_CUBIC)
return best_angle,rotated
这是去偏斜后的图像:
解决方法
cv2.warpaffine文档指出该函数采用一个可选参数,即borderValue
。默认情况下,此值为(0,0)
,您可以通过以下方式调用warpaffine例程来更改此值:
rotated = cv2.warpAffine(image,M,(w,h),flags=cv2.INTER_CUBIC,borderMode = cv2.BORDER_CONSTANT,borderValue=np.array([255,255,255]))