Android基於OpenCV實現圖像修復
圖像修復
實際應用中,圖像常常容易受損,如存在污漬的鏡頭、舊照片的劃痕、人為的塗畫(比如馬賽克),亦或是圖像本身的損壞。將受到損壞的圖像盡可能還原成原來的模樣的技術,稱之為圖像修復。所謂修復,就代表圖像大部分內容是完好的,所以,圖像修復的原理,就是用完好的部分去推斷受損部分的信息,特別是完好部分與受損部分的交界處,即受損區域的邊緣,在這個推斷過程中尤為重要。
OpenCV給我們提供瞭inpaint方法來實現這個功能,並提供瞭兩種圖像修復的算法:
- 基於Navier-Stokes的修復方法
- 基於圖像梯度的快速匹配方法又稱Telea法
API
參數一:src,輸入圖像,類型為8位,16位無符號或32位浮點單通道或8位三通道。
參數二:inpaintMask,修復掩碼,8位單通道圖像。非零像素表示需要修補的區域。
參數三:dst,輸出圖像,與src大小類型相同。
參數四:inpaintRadius,算法考慮的每個點的圓形鄰域的半徑。
參數五:flags,修復方法標志位。
public static final int INPAINT_NS = 0, // 基於Navier-Stokes的方法 INPAINT_TELEA = 1, // 基於圖像梯度的快速匹配方法又稱Telea法
操作
/** * 圖像修復 * author: yidong * 2020/11/28 */ class InPaintActivity : AppCompatActivity() { private val mBinding: ActivityInPaintBinding by lazy { ActivityInPaintBinding.inflate(layoutInflater) } private lateinit var mRgb: Mat override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(mBinding.root) mRgb = Mat() val bgr = Utils.loadResource(this, R.drawable.whiteprint) Imgproc.cvtColor(bgr, mRgb, Imgproc.COLOR_BGR2RGB) mBinding.ivLena.showMat(mRgb) doInPaint() } private fun doInPaint() { val gray = Mat() val mask = Mat() Imgproc.cvtColor(mRgb, gray, Imgproc.COLOR_RGB2GRAY) Imgproc.threshold(gray, mask, 254.0, 255.0, Imgproc.THRESH_BINARY) val kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, Size(20.0, 20.0)) Imgproc.dilate(mask, mask, kernel) val dst = Mat() Photo.inpaint(mRgb, mask, dst, 5.0, Photo.INPAINT_TELEA) mBinding.ivResult.showMat(dst) } }
效果
原圖圖中右下角存在文字,通過圖像修復技術,實現去掉文字內容效果。類似操作可用於去掉水印。代碼中的參數,根據實際需要進行調整。
源碼
github.com/onlyloveyd/…
以上就是Android基於OpenCV實現圖像修復的詳細內容,更多關於Android OpenCV圖像修復的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Python-OpenCV中的cv2.inpaint()函數的使用
- Android基於OpenCV實現圖像脫色
- Android基於OpenCV實現非真實渲染
- OpenCV圖像修復cv2.inpaint()的使用
- OpenCV學習之圖像的分割與修復詳解