मैं फिल्टर 2 डी विधि का उपयोग करके ओपनसीवी में दृढ़ संकल्प खोजने की कोशिश कर रहा हूं लेकिन परिणाम सही नहीं है

import cv2 as cv
import scipy.signal as sig
import numpy as np
b=np.asarray([[1,2,0,1,2],
              [2,3,1,1,2],
              [1,4,2,2,0],
              [3,2,3,3,0],
              [1,0,0,2,1]
              ],dtype=np.uint8)

w=np.asarray([[1,1,1],
              [1,1,2],
              [2,1,1]],dtype=np.uint8)
w_r=np.asarray([[1,1,1],
                [2,1,1],
                [1,1,1]
                ],dtype=np.uint8)
print(sig.convolve2d(b,w,mode="same"))
kernel_r=np.asarray([[1,1,1],[1,1,2],[2,1,1]])
print("-------")
print(cv.filter2D(b,-1,w_r))

पहला आउटपुट scipy.signal.convolve2D द्वारा उत्पन्न होता है जो सही है। दूसरा आउटपुट OpenCV filter2D द्वारा उत्पन्न होता है जो सही नहीं है। मैं सही परिणाम कैसे प्राप्त कर सकता हूं।

[[ 8 10 10  7  7]
 [15 18 20 14  9]
 [18 23 26 18 10]
 [15 21 22 16 11]
 [ 8 13 13  9  8]]
-------
[[23 16 15 11 13]
 [25 18 19 12 13]
 [28 22 25 16 16]
 [19 19 20 16 18]
 [15 18 18 15 19]]
0
Sajid Iqbal 20 अक्टूबर 2019, 23:58

1 उत्तर

सबसे बढ़िया उत्तर

मुझे लगता है, आप अपने cv.filter2d कॉल में कुछ घुमाए गए कर्नेल w_r का उपयोग करना चाहते थे जैसा कि filter2d दस्तावेज़ीकरण:

यदि आपको वास्तविक कनवल्शन की आवश्यकता है, तो का उपयोग करके कर्नेल को फ्लिप करें flip और [...]

तो, पहली समस्या यह है कि आपका मैन्युअल रूप से सेट w_r w का सही, फ़्लिप किया गया संस्करण नहीं है, आप वहां एक 2 भूल गए हैं।

दूसरी समस्या आती है, कैसे scipy.sig.convolve2d< /a> सीमाओं को संभालता है:

सीमा : str {'fill', 'wrap', 'symm'}, वैकल्पिक

सीमाओं को संभालने का तरीका बताने वाला झंडा:

fill

भरण के साथ पैड इनपुट सरणियाँ। (चूक जाना)

दृढ़ संकल्प के बाद प्राप्त मूल्यों से, ऐसा लगता है कि सीमा 0 के साथ गद्देदार है। OpenCV के filter2d के लिए भी ऐसा ही एक विकल्प है, देखें BorderTypes, विशेष रूप से cv.BORDER_CONSTANT। परीक्षणों से ऐसा लगता है कि 0 यहाँ डिफ़ॉल्ट मान है!? (उस पर अब तक कोई दस्तावेज नहीं मिला।)

तो, सही किया गया कोड इस तरह दिख सकता है (अनावश्यक सामान यहां छोड़ा गया है):

import cv2 as cv
import scipy.signal as sig
import numpy as np

b=np.asarray([[1,2,0,1,2],
              [2,3,1,1,2],
              [1,4,2,2,0],
              [3,2,3,3,0],
              [1,0,0,2,1]
              ], dtype=np.uint8)

w=np.asarray([[1,1,1],
              [1,1,2],
              [2,1,1]], dtype=np.uint8)

print(sig.convolve2d(b, w, mode="same"))
print("-------")
print(cv.filter2D(b, -1, cv.flip(w, -1), borderType=cv.BORDER_CONSTANT))

अब, दोनों आउटपुट एक ही परिणाम दिखाते हैं:

[[ 8 10 10  7  7]
 [15 18 20 14  9]
 [18 23 26 18 10]
 [15 21 22 16 11]
 [ 8 13 13  9  8]]
-------
[[ 8 10 10  7  7]
 [15 18 20 14  9]
 [18 23 26 18 10]
 [15 21 22 16 11]
 [ 8 13 13  9  8]]

उम्मीद है की वो मदद करदे!

0
HansHirse 21 अक्टूबर 2019, 07:44