質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

3044閲覧

自作のCIFilterをつくりたい

gotchcuru

総合スコア29

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2016/05/12 09:17

画像を2値化するようなカスタムのCIFilterをつくりたいのですが、うまくいきません。

こちら(https://teratail.com/questions/34679)のエントリを参考に、以下のようなコードを書きました。

しかし、以下のinputImageとoutputImage(CustomFilterの適用後)にあるように、
うまく2値化されません。

原因のわかる方がいらっしゃいましたら、ご教授いただけると幸いです。

(Swift、GLSLともに初心者なので、やさしくお教え頂けると助かります)

Swift

1import Foundation 2import CoreImage 3 4class CustomFilter: CIFilter { 5 6 var inputImage: CIImage? 7 8 var thresholdKernel = CIColorKernel (string: 9 "kernel vec4 thresholdFilter(__sample image, __sample threshold)" + 10 "{" + 11 " vec3 col = image.rgb;" + 12 " float bright = 0.33333 * (col.r + col.g + col.b);" + 13 " float b = mix(0.0, 1.0, step(threshold, bright));" + 14 " return vec4(vec3(b), 1.0);" + 15 "}" 16 ) 17 18 override var outputImage: CIImage! { 19 20 guard let inputImage = inputImage, 21 thresholdKernel = thresholdKernel else 22 { 23 return nil 24 } 25 26 let blurred = inputImage.imageByApplyingFilter("CIBoxBlur", 27 withInputParameters: [kCIInputRadiusKey: 9]) 28 29 let extent = inputImage.extent 30 let arguments = [inputImage, blurred] 31 32 return thresholdKernel.applyWithExtent(extent, arguments: arguments) 33 34 } 35 36}

ViewController

1// ViewController 2・・・ 3override func viewDidLoad() { 4 super.viewDidLoad() 5 6 let filter = CustomFilter() 7 let inputCIImage = CIImage(image: UIImage(named: "inputImage.png")!) 8 filter.inputImage = inputCIImage 9 let outputCIImage = filter.outputImage 10 11 let imageView: UIImageView = UIImageView() 12 imageView.frame = CGRectMake(0, 0, 500, 500) 13 14 let outputImage = UIImage(CIImage: outputCIImage) 15 16 imageView.image = outputImage 17 18 self.view.addSubview(imageView) 19 }

inputImage

outputImage

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

kernel

thresholdの型はfloatです。

kernel vec4 thresholdFilter(__sample image, float threshold)

outputImage

後半部分、

swift

1let extent = inputImage.extent 2let arguments = [inputImage, 0.5] //←2つ目はthreshold 3return thresholdKernel.applyWithExtent(extent, arguments: arguments)

blurredは不要です。

投稿2016/05/12 09:47

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gotchcuru

2016/05/19 05:31

解決しました!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問