img = cv2.imread('input.png', cv2.IMREAD_UNCHANGED)
b, g, r, a = cv2.split(img)
alpha = a / 255.0
b = (b * alpha).astype(np.uint8)
g = (g * alpha).astype(np.uint8)
r = (r * alpha).astype(np.uint8)
premultiplied = cv2.merge((b, g, r, a))
kernel = np.array([[0, -1, 0],
[-1, 5,-1],
[0, -1, 0]])
sharpened_rgb = cv2.filter2D(premultiplied[:, :, :3], -1, kernel)
result = cv2.merge((sharpened_rgb, a))
alpha = a.astype(np.float32) / 255.0
alpha[alpha == 0] = 1 # Prevent divide-by-zero
b = (sharpened_rgb[:, :, 0].astype(np.float32) / alpha).clip(0, 255).astype(np.uint8)
g = (sharpened_rgb[:, :, 1].astype(np.float32) / alpha).clip(0, 255).astype(np.uint8)
r = (sharpened_rgb[:, :, 2].astype(np.float32) / alpha).clip(0, 255).astype(np.uint8)
final = cv2.merge((b, g, r, a))
cv2.imwrite('output.png', final)