Android基於OpenCV實現圖像脫色
脫色
Imgproc.cvtColor(rgb, gray, Imgproc.COLOR_RGB2GRAY)可以快速的實現圖片脫色,其通過簡單的計算將三通道圖像轉換成單通道圖像,經典的灰度轉換公式如下:
但是轉換過的圖像存在對比度丟失,無法區分顏色的問題。OpenCV給我們提供另外一種脫色方法Photo.decolor,旨在最大限度的保留圖片對比度。
原理
論文詳情:www.cse.cuhk.edu.hk/~leojia/pro…
論文PDF:www.computer.org/csdl/pds/ap…
相比於簡單的使用R/G/B線性組合,作者構造瞭更為復雜的多項式擬合,向量空間的基底為:[r,g,b,rg,rb,gb,r2,g2,b2],核心就是求取灰度化函數:
API
public static void decolor(Mat src, Mat grayscale, Mat color_boost)
- 參數一:src,輸入8位三通道圖像。
- 參數二:grayscale,輸出8位單通道灰度圖。
- 參數三:color_boost,輸出8位三通道圖像。對比度增強後的圖像。
操作
/** * 脫色 * author: yidong * 2020/12/5 */ class DecolorActivity : AppCompatActivity() { private val mBinding: ActivityDecolorBinding by lazy { ActivityDecolorBinding.inflate(layoutInflater) } private val mList = mutableListOf<ImageTextObject>() private lateinit var mAdapter: ImageTextAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(mBinding.root) mAdapter = ImageTextAdapter(this, mList) mBinding.container.adapter = mAdapter val bgr = Utils.loadResource(this, R.drawable.ceil) val rgb = Mat() Imgproc.cvtColor(bgr, rgb, Imgproc.COLOR_BGR2RGB) val gray = Mat() val dst = Mat() val boost = Mat() mBinding.isLoading = true GlobalScope.launch(Dispatchers.IO) { Imgproc.cvtColor(rgb, gray, Imgproc.COLOR_RGB2GRAY) Photo.decolor(rgb, dst, boost) launch(Dispatchers.Main) { mList.add(ImageTextObject(rgb, "原圖")) mList.add(ImageTextObject(gray, "RGB2GRAY")) mList.add(ImageTextObject(dst, "DeColor")) mList.add(ImageTextObject(boost, "ColorBoosting")) mAdapter.notifyItemRangeInserted(0, 4) mBinding.isLoading = false } } } }
效果
分別采用decolor和RGB2GRAY實現的脫色效果圖,在對比度和顏色保留上效果相差很大。
源碼
github.com/onlyloveyd/…
以上就是Android基於OpenCV實現圖像脫色的詳細內容,更多關於Android OpenCV圖像脫色的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Android基於OpenCV實現圖像修復
- Android基於OpenCV實現非真實渲染
- opencv+圖像處理(Image Processing in OpenCV) 4-0改變顏色空間的過程
- Android+OpenCv4實現邊緣檢測及輪廓繪制出圖像最大邊緣
- Java OpenCV圖像處理之SIFT角點檢測詳解