Sobelフィルタによるエッジ計算をOpenCVで実装したソースコード3種類を以下に載せます.2つは正しい実装で,1つは間違った実装です.
ソーベルフィルタのOpenCVサンプルソースコードでウェブ検索すると,大きく分けて以下の3種類がヒットします.ウェブというのは,正しい情報だけが載っているわけではありません.自分の頭でしっかり考えて,ウェブの内容が正しいか判断する必要があります.ウェブに載っているソースコードが常に正しいと鵜呑みにしてはいけません.SobelフィルタとOpenCVをきちんと理解して判断してください.
ソーベルフィルタ以外のサンプルソースコードも同じです.ソースコード以外も同じです.ウェブには間違った情報がたくさんあります.ウェブの情報の正しさをきちんと判断する知識と能力と判断力が必要です.
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()