opencv / pythonでフィルタリングする

Nov 10 2020

私はopencvでフィルターを学び、このコードを実行しようとしています。しかし、問題は、コードを実行すると、ほとんど暗い画像が表示され、「c:/ Users / fazil / Desktop / Yeni Metin Belgesi(3).py:19:RuntimeWarning:オーバーフローがubyte_scalarsで発生しました」という警告が表示されることです。 j、i、a] = int((image [j、i、a] + image [j、i-1、a] + image [j、i + 1、a] + image [j + 1、i、a ] + image [j-1、i、a] + image [j + 1、i + 1、a] + image [j + 1、i-1、a] + image [j-1、i-1、a ] + image [j-1、i + 1、a])/ 9) "。そして、これらをコメントアウトして、cv2.filter2dメソッドで動作する行を使用してコードを実行すると、ほぼ白っぽいイメージが得られます。つまり、彼らは同じことをする必要はありません、そしてそのフィルターは画像をぼやけさせますか?これが私のコードです。

import cv2

image=cv2.imread(r"C:\Users\fazil\Desktop\c.png")
cv2.imshow("input",image)
cv2.cvtColor(image,cv2.CV_8U)
# kernel=np.array([
#     [1,1,1],
#     [1,1,1],
#     [1,1,1]
# ],np.float32)
# image=cv2.filter2D(image,-1,kernel)
def blur(image):
    height,width,channel=image.shape
    result=np.zeros(image.shape,image.dtype)
    for j in range(1,height-1):
        for i in range(1,width-1):
            for a in range(channel):
                result[j,i,a]=int((image[j,i,a]+image[j,i-1,a]+image[j,i+1,a]+image[j+1,i,a]+image[j-1,i,a]+image[j+1,i+1,a]+image[j+1,i-1,a]+image[j-1,i-1,a]+image[j-1,i+1,a])/9)
    return result

cv2.imshow("output",blur(image))
cv2.imwrite(r"C:\Users\fazil\Desktop\output.png",image)
cv2.waitKey()
cv2.destroyAllWindows()  ```

回答

1 fmw42 Nov 11 2020 at 19:45

次の2つの方法は、PythonOpenCVで機能します

入力:

import cv2
import numpy as np

image=cv2.imread("barn.jpg")
image=image.astype(np.float32)/255
#cv2.cvtColor(image,cv2.CV_8U)
kernel=np.array([
                [1,1,1],
                [1,1,1],
                [1,1,1]
                ],np.float32)
outimage1=cv2.filter2D(image,cv2.CV_32F,kernel)/9
outimage1=(255*outimage1).clip(0,255).astype(np.uint8)

def blur(image):
    height,width,channel=image.shape
    result=np.zeros(image.shape,dtype=np.float32)
    for j in range(1,height-1):
        for i in range(1,width-1):
            for a in range(channel):
                result[j,i,a]=(255*(image[j-1,i-1,a]+image[j-1,i,a]+image[j-1,i+1,a]+image[j,i-1,a]+image[j,i,a]+image[j,i+1,a]+image[j+1,i-1,a]+image[j+1,i,a]+image[j+1,i+1,a])/9)
    return result

outimage2 = blur(image)
outimage2 = outimage2.clip(0,255).astype(np.uint8)

cv2.imshow("input",image)
cv2.imshow("output1",outimage1)
cv2.imshow("output2",outimage2)
cv2.imwrite("barn_blur1.jpg",outimage1)
cv2.imwrite("barn_blur2.jpg",outimage2)
cv2.waitKey()
cv2.destroyAllWindows()

ぼかし方法1:

ぼかし方法2: