何が起こっているかの説明については、opencv オペレーターの構成に関する以前の質問を参照してください。
私は、一種の構成可能な方法で破壊的なバイナリ操作を構成できる新しいインターフェイスを考えました。
newtype IOP a b = IOP (a -> IO b)
instance Category IOP where
id = IOP return
(IOP f) . (IOP g) = IOP $ g >=> f
(&#&) :: IOP (Image c d) e -> IOP (Image c d) f
-> IOP (Image c d) (Image c d,Image c d)
(IOP f) &#& (IOP g) = IOP $ op
where
op i = withClone i $ \cl -> (f i >> g cl >> return (i,cl))
runIOP (IOP f) img = withClone img f
これにより、「ガウス演算子の減算」を簡単に表現できます。
subtract :: IOP (Image c d, Image c1 d1) (Image c d)
mulScalar :: d -> IOP (Image c d) (Image c d)
subtractScalar :: d -> IOP (Image c d) (Image c d)
gaussian :: (Int, Int) -> IOP (Image GrayScale D32) (Image GrayScale D32)
(gaussian (11,11) &#& id) >>> subtract >>> mulScalar 5
私には、これは非常に安全な代替手段のように思えますが、減算後の何らかの操作でこれが必要な場合は、おそらく複製されたイメージも再利用できるという意味では最適ではありません。しかし、それは完全に純粋で最適化されていないバージョンの代替として受け入れられるように思えます:
mulScalar 5 $ gaussian (11,11) img `subtract` img
-- Or with nicer names for the operators
5 * gaussian (11,11) img - img
質問
- そもそもこれは合理的な構造ですか?
- 前の質問の構造を好む理由はありますか?
- これをどのように拡張して、「画像内の最小値を見つけ、それを画像から減算し、画像にその範囲 (最大-最小) を掛ける」という操作を実装するにはどうすればよいでしょうか。
- 代わりに、これらを複数の質問に分割する必要がありますか?