原图:
效果:
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
Mat dealGray(Mat &img);
void dealShuiCai(Mat &img);
int main() {
Mat img = imread("E://图片//880.jpg");
if (img.empty()) {
return 0;
}
dealShuiCai(img);
return 0;
}
Mat dealGray(Mat & img){
Mat temp;
cvtColor(img, temp, CV_BGR2GRAY);
for (int i = 0; i < temp.rows; i++) {
uchar *p = temp.ptr<uchar>(i);
for (int j = 0; j < temp.cols; j++) {
if (p[j] < 123) {
p[j] = 255;
}
else {
p[j] = 0;
}
}
}
return temp;
}
void dealShuiCai(Mat & img){
Mat mask = dealGray(img);
Mat bImg = imread("E://图片//纹理//662.jpg");
if (bImg.empty()) {
return ;
}
resize(bImg, bImg, mask.size());
Mat result(mask.size(), mask.type());
bImg.copyTo(result, mask);
for (int i = 0; i < img.rows; i++) {
uchar *p = result.ptr<uchar>(i);
for (int j = 0;j < img.cols; j++) {
if (p[j * 3 + 0] == 0) {
p[j * 3 + 0] = 255;
}
if (p[j * 3 + 1] == 0) {
p[j * 3 + 1] = 255;
}
if (p[j * 3 + 2] == 0) {
p[j * 3 + 2] = 255;
}
}
}
Mat bIm = imread("E://图片//纹理//004.jpg");
if (bIm.empty()) {
return;
}
Mat tem;
result.convertTo(tem, CV_32F);
Mat img2;
resize(bIm, img2, tem.size());
img2.convertTo(img2, CV_32F);
Mat result1 = tem.clone();
float alpha = 0.35;
for (int i = 0; i < tem.rows; i++) {
float *ptr_result = result1.ptr<float>(i);
float *ptr_temp = img2.ptr<float>(i);
float *ptr_img1 = tem.ptr<float>(i);
for (int j = 0; j < tem.cols; j++) {
ptr_result[j * 3 + 0] = (1 - alpha)*ptr_img1[j * 3 + 0] + alpha*ptr_temp[j * 3 + 0];
ptr_result[j * 3 + 1] = (1 - alpha)*ptr_img1[j * 3 + 1] + alpha*ptr_temp[j * 3 + 1];
ptr_result[j * 3 + 2] = (1 - alpha)*ptr_img1[j * 3 + 2] + alpha*ptr_temp[j * 3 + 2];
}
}
result1.convertTo(result1, CV_8U);
imshow("result", result1);
waitKey(0);
destroyAllWindows;
}