ソーベルフィルタのOpenCVによる実装

Tweet


Sobelフィルタによるエッジ計算をOpenCVで実装したソースコード3種類を以下に載せます.2つは正しい実装で,1つは間違った実装です.

ソーベルフィルタのOpenCVサンプルソースコードでウェブ検索すると,大きく分けて以下の3種類がヒットします.ウェブというのは,正しい情報だけが載っているわけではありません.自分の頭でしっかり考えて,ウェブの内容が正しいか判断する必要があります.ウェブに載っているソースコードが常に正しいと鵜呑みにしてはいけません.SobelフィルタとOpenCVをきちんと理解して判断してください.

ソーベルフィルタ以外のサンプルソースコードも同じです.ソースコード以外も同じです.ウェブには間違った情報がたくさんあります.ウェブの情報の正しさをきちんと判断する知識と能力と判断力が必要です.


circle.png


from google.colab import files
import os
import numpy as np
import cv2

def main():
    if os.path.exists('circle.png'):
        os.remove('circle.png')
    files.upload()

    img = cv2.imread('circle.png', cv2.IMREAD_COLOR)
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    dx = cv2.Sobel(img_gray, cv2.CV_64F, 1, 0, ksize=3)
    dy = cv2.Sobel(img_gray, cv2.CV_64F, 0, 1, ksize=3)
    output = np.sqrt(dx ** 2 + dy ** 2)

    cv2.imwrite('result1.png', output)
    files.download('result1.png')

if __name__ == '__main__':
    main()


from google.colab import files
import os
import cv2

def main():
    if os.path.exists('circle.png'):
        os.remove('circle.png')
    files.upload()

    img = cv2.imread('circle.png', cv2.IMREAD_COLOR)
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    output = cv2.Sobel(img_gray, cv2.CV_64F, 1, 1, ksize=3)

    cv2.imwrite('result2.png', output)
    files.download('result2.png')

if __name__ == '__main__':
    main()


from google.colab import files
import os
import numpy as np
import cv2

def main():
    if os.path.exists('circle.png'):
        os.remove('circle.png')
    files.upload()

    image = cv2.imread('circle.png', cv2.IMREAD_COLOR)
    input = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    input = np.float64(input)
    input = input / 255

    filterx = [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]
    filtery = [[-1, -2, -1], [0, 0, 0], [1, 2, 1]]
    output = input.copy()
    row, col = output.shape
    for y in range(0, row):
        for x in range(0, col):
            dx = 0
            dy = 0
            for i in range(0, 3):
                for j in range(0, 3):
                    yy = y + i - 1
                    xx = x + j - 1
                    if xx >= 0 and yy >= 0 and xx < col and yy < row:
                        val = input[yy, xx]
                        dx += val * filterx[i][j]
                        dy += val * filtery[i][j]
            output[y, x] = np.sqrt(dx ** 2 + dy ** 2)

    cv2.imwrite('result3.png', output * 255)
    files.download('result3.png')

if __name__ == '__main__':
    main()


もどる