filter2D(img_gray, img_emboss, -1, kernel, Point(-1, -1), 128, BORDER_REPLICATE);
时间: 2023-10-07 08:09:35 浏览: 56
这行代码是在进行图像卷积操作,使用的卷积核是 kernel。其中 img_gray 是输入的灰度图像,img_emboss 是输出的图像,-1 表示输出图像与输入图像具有相同的深度(即灰度值的范围相同),Point(-1, -1) 表示卷积核的锚点(即卷积核中心)位于卷积核的中心位置,128 是边界填充的值,BORDER_REPLICATE 表示使用复制法填充边界。这段代码的作用是对灰度图像进行浮雕效果的卷积处理。
相关问题
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { Mat img = imread("D:/360MoveData/Users/15312/Desktop/zy3/1/jpg"); // 读取图像 Mat img_gray = imread("D:/360MoveData/Users/15312/Desktop/zy3/1/jpg",IMREAD_GRAYSCALE); // 读取图像 Mat img_emboss; // 定义浮雕核 float kernel_data[3][3] = { {-1, -1, 0}, {-1, 0, 1}, { 0, 1, 1} }; Mat kernel = Mat(3, 3, CV_32F, kernel_data); img_gray.convertTo(img_gray,CV_32F); // 对灰度图像进行浮雕处理 filter2D(img_gray, img_emboss, -1, kernel, Point(-1, -1), 128, BORDER_REPLICATE); // 显示原图像和浮雕图像 namedWindow("Input Image", WINDOW_NORMAL); namedWindow("Embossed Image", WINDOW_NORMAL); imshow("Input Image", img); imshow("Embossed Image", img_emboss); waitKey(0); // 等待按键 return 0; }存在问题
你的代码存在两个问题:
1. 读取图像时,应该提供完整的路径和文件名,而不仅仅是文件夹路径。
比如:`Mat img = imread("D:/360MoveData/Users/15312/Desktop/zy3/1/jpg/1.jpg");`
2. 在进行浮雕处理前,需要将图像的像素值类型转换为浮点型,即`CV_F`类型。因此需要将`img_gray`进行类型转换:
`img_gray.convertTo(img_gray,CV_32F);`
修改后的代码如下:
```
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
Mat img = imread("D:/360MoveData/Users/15312/Desktop/zy3/1/jpg/1.jpg"); // 读取图像
Mat img_gray = imread("D:/360MoveData/Users/15312/Desktop/zy3/1/jpg/1.jpg",IMREAD_GRAYSCALE); // 读取图像
Mat img_emboss;
// 定义浮雕核
float kernel_data[3][3] = {
{-1, -1, 0},
{-1, 0, 1},
{ 0, 1, 1}
};
Mat kernel = Mat(3, 3, CV_32F, kernel_data);
img_gray.convertTo(img_gray,CV_32F); // 将灰度图像像素值类型转换为浮点型
// 对灰度图像进行浮雕处理
filter2D(img_gray, img_emboss, -1, kernel, Point(-1, -1), 128, BORDER_REPLICATE);
// 显示原图像和浮雕图像
namedWindow("Input Image", WINDOW_NORMAL);
namedWindow("Embossed Image", WINDOW_NORMAL);
imshow("Input Image", img);
imshow("Embossed Image", img_emboss);
waitKey(0); // 等待按键
return 0;
}
```
用c语言改写import cv2 import numpy as np #读取原始图像 src = cv2.imread('scenery.png') #图像灰度处理 gray = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #自定义卷积核 kernel = np.array([[-1,-1,-1],[-1,10,-1],[-1,-1,-1]]) #kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]]) #图像浮雕效果 output = cv2.filter2D(gray, -1, kernel) #显示图像 cv2.imshow('Original Image', src) cv2.imshow('Emboss_1',output) #等待显示 cv2.waitKey() cv2.destroyAllWindows()
将上述代码用C语言进行改写需要使用OpenCV库和Numpy库的C语言接口。以下是一个简单的例子,用于读取一张图像并对其进行浮雕处理:
```c
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgcodecs/imgcodecs.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char** argv) {
Mat src, gray, output;
src = imread("scenery.png", IMREAD_COLOR);
if (src.empty()) {
printf("Could not open or find the image\n");
return -1;
}
cvtColor(src, gray, COLOR_BGR2GRAY);
Mat kernel = (Mat_<float>(3, 3) <<
-1, -1, -1,
-1, 10, -1,
-1, -1, -1);
filter2D(gray, output, -1, kernel, Point(-1, -1), 0, BORDER_DEFAULT);
namedWindow("Original Image", WINDOW_AUTOSIZE);
namedWindow("Emboss_1", WINDOW_AUTOSIZE);
imshow("Original Image", src);
imshow("Emboss_1", output);
waitKey(0);
return 0;
}
```
这个程序首先使用OpenCV库的imread函数读取输入图像,然后使用cvtColor函数将图像转换为灰度图像。接下来,创建一个3x3的矩阵作为卷积核,然后使用filter2D函数进行卷积操作。最后,使用imshow函数显示原始图像和浮雕效果图像,并使用waitKey函数等待用户按下任意键以关闭窗口。