OpenCVの各種機能(1)

5577 ワード

  • imread()
  • 画像を白黒で読み込む
    imread()-COLOR=RGB読み出し
    imread()-GraYSCALE=階調として読み込む
    imread()-innovation=ファイル属性で読み込む
  • 画像オブジェクト属性、画素アクセス
  • オブジェクトのタイプ、要素のデータ型、ピクセル全体の数、シェイプの色、グレースケールイメージを識別します.
    を選択します.
    出力値3がカラー画像であり、2が階調画像であることをshapeで認識する.
    ピクセルにアクセスし、そのピクセルの値を変更します.

    作成/コピー
  • 画像
  • この部分は画像を生成してコピーする部分なので、スキップしましょう.
  • グラフィック描画
  • 直線、矩形、円、多角形を描くことができます.
    プロジェクトに適用される長方形の描画を見てみましょう.
    rectangle(img, pt1, pt2, color, thickness, lineType, shift)
    
    rectangle(img, rec, color, thickness, lineType, shift)
    関数は次のとおりです.
    img(長方形を描く位置)、pt 1(基点1)、pt 2(基点2)、color(長方形を描く直線の色)、直線のタイプ(デフォルトLINE 8、LINE 4など)、座標値を描くスケールのデフォルト値は0
    LINE 4とLINE 8は、隣接する画素を4方向の1つに塗りつぶすか、8方向の1つに塗りつぶすかを決める.

    binding.canvas.setOnTouchListener { v, event ->
        when (event.action) {
            MotionEvent.ACTION_DOWN -> {
                initX = event.x
                initY = event.y
            }
            MotionEvent.ACTION_MOVE -> {
                mat = Mat.zeros(
                    binding.canvas.measuredHeight,
                    binding.canvas.measuredWidth,
                    CvType.CV_8UC3
                )
                when (binding.radioGroup.checkedRadioButtonId) {
                    R.id.line -> {
                        Imgproc.line(
                            mat,
                            Point(initX.toDouble(), initY.toDouble()),
                            Point(event.x.toDouble(), event.y.toDouble()),
                            Scalar(255.0, 0.0, 0.0)
                        )
                    }
                    R.id.rectangle -> {
                        Imgproc.rectangle(
                            mat,
                            Point(initX.toDouble(), initY.toDouble()),
                            Point(event.x.toDouble(), event.y.toDouble()),
                            Scalar(255.0, 0.0, 0.0)
                        )
                    }
                    R.id.circle -> {
                        val absX = abs(initX - event.x)
                        val absY = abs(initY - event.y)
                        Imgproc.circle(
                            mat,
                            Point(initX.toDouble(), initY.toDouble()),
                            sqrt(absX * absX + absY * absY).toInt(),
                            Scalar(255.0, 0.0, 0.0)
                        )
                    }
                }
                val bmp = Bitmap.createBitmap(mat.cols(), mat.rows(), Bitmap.Config.ARGB_8888)
                Utils.matToBitmap(mat, bmp)
                binding.canvas.setImageBitmap(bmp)
            }
        }
        true
    }
  • 画像輝度調整
  • 基本カラー画像だけでなく、階調画像の明るさも調整できます.
    明るくするときはadd()、暗くするときはsub()を使い、簡単に変換できます.
    単純な例
    private fun calcBrightness(src: Mat, additionalBrightness: Int): Mat {
        // 밝기를 스칼라값으로 치환
        val src2 = Scalar.all(additionalBrightness.toDouble())
        val dst = Mat()
        Core.add(src, src2, dst)
        return dst
    }
  • 画像フィルタ
  • アルゴリズムによるピクセル値の変更による画像への影響
    これは、画像をぼやけ、鋭く、明瞭にし、ノイズを除去するのに役立ちます.
    blur()
    既定では、画像をぼかします.
    眼鏡をかけているような感じがします

    GaussianBlur()
    blurと同様に、ブラー効果もありますが、blurとは異なります.
    GaussianBlurは全体密度が同じノイズと白色ノイズを効果的に除去できる.

    medianBlur()
    ノイズ除去に使用します.

    bilateralFilter()
    これまでの処理では境界がぼやけ、二重フィルタでは境界が維持されます.
    結果を見るとメイクをしているような気がします
  • ジオメトリ変換
  • 拡大・縮小
    resize()
    たいしょう
    flip()
    移動
    warpAffine()
    回転
    getRotation()
    warpAffine()
  • 微分フィルタ
  • 画像を検出します.
    境界を検出するには、ピクセル値の変化が急激でなければなりません.
    境界値は、連続画素値を微分演算することによって検出される.
    画像中の画素データは離散的で不連続であり,近似値で計算した.
    numpy
    x軸方向微分gx
    y軸方向微分y
  • ロバーツマスク
  • ロバーツマスクは対角線方向に1と−1を配置し,斜め画像検出効果を向上させた.
    その欠点は速度が速いが,ノイズに敏感でエッジ強度が低いことである.
  • Prewittマスク
  • 従来の微分を3回処理することで、より高い画像強度が得られ、垂直および水平の画像と同等の利点がある.対角線検出能力は垂直および水平に比べて劣る.
  • ソベル
  • 代表的なフィルタはPrewittフィルタの2倍のピクセルウェイトです.
    相対対角線検出能力が弱いPrewittフィルタに対してSobelは水平、垂直、対角線検出能力が強い.
  • シャール(Scharr)
  • ピクセルの重みをPrewittフィルタの3、10、3倍に増やします.
    水平、垂直、対角線の検出能力が強い.
  • ラプラス西安
  • 代表的な二次微分フィルタは,ノイズ成分に非常に敏感で,より多くの画像を検出する傾向がある.そのため、適用する前にノイズを除去することを推奨します.
  • Magnitude calculation
  • x:2 Dベクトルのx座標行列(実数)
    y:2 Dベクトルのy座標行列(実型)
    magnigude:xサイズやデータ型などの2 Dベクトルのサイズマトリクス
  • Canny
  • ガウスフィルタによるノイズ除去
    「Sobel」(Sobel)フィルタを使用してグラデーション方向
    非最大値抑制勾配方向のみ検出最大値
    Theresholdingを使用して境界値(最小、最大)を指定することで境界を指定します.
    トップしきい値

    下のしきい値