python 在使用skimage.transform旋转图像后,如何使用阈值处理来提高图像质量?

czq61nw1  于 2022-12-02  发布在  Python
关注(0)|答案(2)|浏览(219)

我有下面的图像:
Initial Image
我使用下面的代码旋转图像:

from skimage.transform import rotate
image = cv2.imread('122.png')
rotated = rotate(image,34,cval=1,resize = True)

一旦我执行了这段代码,我就会收到下面的图像:
Rotated Image
为了消除图像上的模糊,我使用下面的代码来设置一个阈值。任何非白色的东西都变成黑色(所以灰色的点变成黑色)。代码如下:

ret, thresh_hold = cv2.threshold(rotated, 0, 100, cv2.THRESH_BINARY)
plt.imshow(thresh_hold)

而不是得到一个很好的清晰图片,我收到以下:
Choppy Image

有人知道我可以做些什么来提高图像质量,或者调整阈值来创建更清晰的图像吗?
我试图将阈值调整为不同的值,但这将图像更改为全黑或全白色。

w1jd8yoj

w1jd8yoj1#

要提高旋转图像后的图像质量,您可以尝试在旋转图像时使用不同的插值方法。skimage.transform中的rotate函数有一个mode参数,允许您指定要使用的插值方法。默认值为constant。这意味着它对输入图像边界之外的像素使用常量值(由cval参数指定)。
您可以尝试使用不同的插值方法,例如bilinearbicubic,在某些情况下可以提供更好的结果。例如,以下代码使用bilinear插值方法:

from skimage.transform import rotate
image = cv2.imread('122.png')
rotated = rotate(image, 34, cval=1, resize=True, mode='bilinear')

除了使用不同的插值方法外,您还可以尝试在对旋转图像应用阈值时使用不同的阈值。cv2.threshold函数有一个threshold参数,用于指定要使用的阈值。默认情况下,该参数设置为0。这意味着值小于或等于0的所有像素都将被设置为0(黑色),所有其他像素将设置为maxval参数指定的最大值(在您的情况下为100)。

ret, thresh_hold = cv2.threshold(rotated, 127, 255, cv2.THRESH_BINARY)
plt.imshow(thresh_hold)

或者,您也可以使用cv2.THRESH_BINARY_INV旗标来取代cv2.THRESH_BINARY,以反转临界值结果,让值小于或相等127的像素设定为255(白色),而所有其他像素则设定为0(黑色)。下列程式码显示如何执行此动作:

ret, thresh_hold = cv2.threshold(rotated, 127, 255, cv2.THRESH_BINARY_INV)
plt.imshow(thresh_hold)
ua4mk5z4

ua4mk5z42#

一种方法是在Python/OpenCV中简单地对图像进行反锯齿处理。
要做到这一点,一个简单的转换到灰度。然后模糊图像,然后应用图像的拉伸。
调整模糊sigma以更改抗锯齿。
输入:

import cv2
import numpy as np
import skimage.exposure

# load image
img = cv2.imread('122.png')

# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# blur threshold image
blur = cv2.GaussianBlur(gray, (0,0), sigmaX=2, sigmaY=2, borderType = cv2.BORDER_DEFAULT)

# stretch so that 255 -> 255 and 127.5 -> 0
result = skimage.exposure.rescale_intensity(blur, in_range=(127.5,255), out_range=(0,255)).astype(np.uint8)

# save output
cv2.imwrite('122_antialiased.png', result)

# Display various images to see the steps
cv2.imshow('result', result)

cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

相关问题