眼镜反光检测

参考文章:https://blog.csdn.net/weiwei9363/article/details/85046877#_45

首先我们可以手机一批数据使用数据训练一哥网络模型,

测试代码(.h5模型在CSDN里可以下载)


import tensorflow as tf
import os
import glob
from skimage import io
import matplotlib.pyplot as plt 

os.environ['CUDA_VISIBLE_DEVICES'] = '1'

import numpy as np
from keras.layers import  Input,Conv2D,BatchNormalization,Activation,Subtract
from keras.models import Model, load_model
from keras.callbacks import CSVLogger, ModelCheckpoint, LearningRateScheduler
from keras.optimizers import Adam
import keras.backend as K

model = load_model('FCN_baseline.h5')

img = io.imread('./CVC-612/bbdd_png/7.jpg')
img = img.astype('float') / 255.0
img = np.expand_dims(img, axis=0)

specular_mask = model.predict(img)
th = 0.4
specular_mask[specular_mask > 0.6] = 1.0
specular_mask[specular_mask <= 0.6] = 0

plt.subplot(1,2,1)
plt.imshow(img[0, :,:,:])
plt.subplot(1,2,2)
plt.imshow(specular_mask[0, :,:,0], cmap='gray')
plt.show()

效果:

-------------------------------》输出=================》》

效果还可以,但是速度比较慢。

二:对与已经识别出来的反光模块,我们就可以做反光消除了,具体代码如下,main函数

#include <iostream>
#include <map>
#include <opencv2/opencv.hpp>
#include "FastDigitalImageInpainting.hpp"

std::map<std::string, std::string> path =
{
	{"Image", "G:/反光/Fast-Digital-Image-Inpainting-master/data/image.png"},
	{"Mask", "G:/反光/Fast-Digital-Image-Inpainting-master/data/mask.png"},
	{"Output", "G:/反光/Fast-Digital-Image-Inpainting-master/data/inpaint.png"}
};

void main()
{
	cv::Mat src = cv::imread(path["Image"]);
	cv::Mat mask = cv::imread(path["Mask"]);
	cv::Mat res;

	cv::imshow("src", src);
	cv::imshow("mask", mask);
	cv::waitKey(1);

	std::cout << "inpainting...";
	inpaint(src, mask, K, res, 500);
	std::cout << " done!" << std::endl;

	cv::imwrite(path["Output"], res);
	cv::imshow("Convolutional Inpainting (Result)", res);
	cv::waitKey();
}

头文件FastDigitalImageInpainting.hpp

#pragma once

#include <opencv2/opencv.hpp>

static const float a(0.073235f);
static const float b(0.176765f);
static const cv::Mat K = (cv::Mat_<float>(3, 3) << a, b, a, b, 0.0f, b, a, b, a);

void inpaint(const cv::Mat &src, const cv::Mat &mask, const cv::Mat kernel, cv::Mat &dst, int maxNumOfIter = 100)
{
	assert(src.type() == mask.type() && mask.type() == CV_8UC3);
	assert(src.size() == mask.size());
	assert(kernel.type() == CV_32F);

	// fill in the missing region with the input's average color
	auto avgColor = cv::sum(src) / (src.cols * src.rows);
	cv::Mat avgColorMat(1, 1, CV_8UC3);
	avgColorMat.at<cv::Vec3b>(0, 0) = cv::Vec3b(avgColor[0], avgColor[1], avgColor[2]);
	cv::resize(avgColorMat, avgColorMat, src.size(), 0.0, 0.0, cv::INTER_NEAREST);
	cv::Mat result = (mask / 255).mul(src) + (1 - mask / 255).mul(avgColorMat);

	// convolution
	int bSize = K.cols / 2;
	cv::Mat kernel3ch, inWithBorder;
	result.convertTo(result, CV_32FC3);
	cv::cvtColor(kernel, kernel3ch, cv::COLOR_GRAY2BGR);

	cv::copyMakeBorder(result, inWithBorder, bSize, bSize, bSize, bSize, cv::BORDER_REPLICATE);
	cv::Mat resInWithBorder = cv::Mat(inWithBorder, cv::Rect(bSize, bSize, result.cols, result.rows));

	const int ch = result.channels();
	for (int itr = 0; itr < maxNumOfIter; ++itr)
	{
		cv::copyMakeBorder(result, inWithBorder, bSize, bSize, bSize, bSize, cv::BORDER_REPLICATE);

		for (int r = 0; r < result.rows; ++r)
		{
			const uchar *pMask = mask.ptr(r);
			float *pRes = result.ptr<float>(r);
			for (int c = 0; c < result.cols; ++c)
			{
				if (pMask[ch * c] == 0)
				{
					cv::Rect rectRoi(c, r, K.cols, K.rows);
					cv::Mat roi(inWithBorder, rectRoi);

					auto sum = cv::sum(kernel3ch.mul(roi));
					pRes[ch * c + 0] = sum[0];
					pRes[ch * c + 1] = sum[1];
					pRes[ch * c + 2] = sum[2];
				}
			}
		}

		// for debugging
		cv::imshow("Inpainting...", result / 255.0f);
		cv::waitKey(1);
	}

	result.convertTo(dst, CV_8UC3);
}

运行效果如下:

 

 

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值