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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

668閲覧

SwiftのUIimageをMNIST用に編集したい

sin_onigiri

総合スコア2

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2020/05/18 16:05

前提・実現したいこと

現在coreMLを使いCanvas内に手書きで書いた文字を認識し、予想結果を表示するアプリを作成しています。
文字を書くCanva部分をネットで作例を見ながらSwiftUIで作り、このCanvas部分のみを切り抜き、UIimageとして保存できる様にしました。
保存できる様にしたのは実際切り抜きが上手くいっているか確認する為で、実際には保存せず、MNIST用の画像に処理して学習modelに渡す様に変更するつもりです。
このUIimageをMNIST用に変更する方法が分かりません。
ネットで見つけたMNISTの作例はUIkitで作られており(下記コード)、UIView型のCanvasViewをmodel用に変更してから複製し、CGImage型に変更しているのは何となく分かるのですが、自分のUIimage型の画像を変更する様にどう置き換えて良いかが分かりません。
modelにはCGImage型か、CVPixelBuffer型が渡せる様です。
(最近Swiftを始めSwiftUIしか触った事がない為、UIkitなどがまだよく分かっていません)

該当のソースコード

class CanvasView: UIView {  //Canvasの中身 func getViewContext() -> CGContext? { // our network takes in only grayscale images as input let colorSpace:CGColorSpace = CGColorSpaceCreateDeviceGray() // we have 3 channels no alpha value put in the network let bitmapInfo = CGImageAlphaInfo.none.rawValue // this is where our view pixel data will go in once we make the render call let context = CGContext(data: nil, width: 28, height: 28, bitsPerComponent: 8, bytesPerRow: 28, space: colorSpace, bitmapInfo: bitmapInfo) // scale and translate so we have the full digit and in MNIST standard size 28x28 context!.translateBy(x: 0 , y: 28) context!.scaleBy(x: 28/self.frame.size.width, y: -28/self.frame.size.height) // put view pixel data in context self.layer.render(in: context!) return context } } //buttonを押したら下のコードが働きcgimageにした後、学習 guard let cgImage = drawView.getViewContext()?.makeImage() else {return}

試したこと

func getViewContext()の引数に(img:UIimage)を追加し
context!.scaleBy(x: 28/self.frame.size.width, y: -28/self.frame.size.height)
のself.frameの部分をimgにしてみましたが、その後の
self.layer.render(in: context!)
をどう変更して良いか分かりませんでした。

補足情報(FW/ツールのバージョンなど)

Xcode11.4.1

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

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

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

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

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

thyda.eiqau

2020/05/18 17:47

明るくないので的外れかもしれませんが、いまUIImageで取得することができていて、CGImageが得られればよいのですよね。UIImageをCGImageに変換するのではダメなのですか?
sin_onigiri

2020/05/19 00:25

UIimage、もしくはCG imageに変換した後、サンプルコードの様にwidth, height, bitsPerComponent, bytesPerRow, space, bitmapInfoなどを指定して変換したいのですがその方法があれば教えて頂きたいです。
guest

回答1

0

ベストアンサー

UIImage を 28x28 のグレイスケール CGImage に変換すればいいんですよね。とりあえずこんな感じでしょうか。(メソッドではなく、独立した関数になってます。)

swift

1func convertImage(image: UIImage) -> CGImage? { 2 let colorSpace = CGColorSpaceCreateDeviceGray() 3 let bitmapInfo = CGImageAlphaInfo.none.rawValue 4 let context = CGContext(data: nil, width: 28, height: 28, bitsPerComponent: 8, bytesPerRow: 28, space: colorSpace, bitmapInfo: bitmapInfo) 5 context?.draw(image.cgImage!, in: CGRect(x: 0, y: 0, width: 28, height: 28)) 6 return context?.makeImage() 7}

投稿2020/05/19 01:49

hoshi-takanori

総合スコア7901

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

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

sin_onigiri

2020/05/19 05:45

ありがとうございます! まだmodelに渡すまではやっていませんができた画像を確認してみると出来ている感じでした。 これから色々試行錯誤してやってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問