在OpenCV或skimage中使用Projection Profile Deskew方法后,将旋转图像的背景更改为白色,而不是黑色

问题描述

我在二进制图像上使用了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

这是去偏斜后的图像:

Image After Deskewing

原始二进制图像:

enter image description here

解决方法

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]))

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...