Mat gray = img; Cv2.CvtColor(img, gray, ColorConversionCodes.BGR2GRAY); Mat mask = gray; Cv2.Threshold(gray, mask, 245, 255, ThresholdTypes.Binary); Mat kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(3, 3)); Cv2.Dilate(mask, mask, kernel); //Cv2.Inpaint(img, mask, result, 5, InpaintMethod.NS); Bitmap bitmap1 = BitmapConverter.ToBitmap(mask); //Bitmap bitmap1 = BitmapConverter.ToBitmap(result); pictureBox1.Image = bitmap1;
时间: 2024-02-14 16:36:03 浏览: 154
这段代码使用了OpenCV库进行图像处理,主要实现了以下功能:
1. 将彩色图像转化为灰度图像:将原始图像img转化为灰度图像gray,使用Cv2.CvtColor()函数,参数中的ColorConversionCodes.BGR2GRAY表示将BGR颜色空间转化为灰度颜色空间。
2. 对灰度图像进行阈值处理:将灰度图像gray进行阈值处理,将灰度值大于245的像素点的像素值设为255,其他像素值设为0。使用Cv2.Threshold()函数,其中ThresholdTypes.Binary表示二值化处理。
3. 对阈值图像进行膨胀操作:对上一步得到的阈值图像mask进行膨胀操作,使图像中的白色区域扩大。使用Cv2.Dilate()函数,参数中的kernel表示膨胀核的大小和形状。
4. 显示处理后的图像:将处理后的图像转化为Bitmap格式,并在PictureBox控件中显示。使用BitmapConverter.ToBitmap()函数将OpenCV中的Mat类型图像转化为Bitmap类型图像。
最后,这段代码注释掉了一行代码,这行代码使用了Cv2.Inpaint()函数进行图像修复,但是被注释掉了。
相关问题
#include <iostream> #include <opencv2/highgui.hpp> #include <opencv2/core.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; int main() { Mat img = imread("F:\\图像处理\\图片\\待修复图像.png"); if (img.empty()) { cout << "请检查文件名称是否有误!" << endl; return -1; } imshow("img", img); //转化为灰度图 Mat gray; cvtColor(img, gray, COLOR_BGR2GRAY); //通过阈值处理生成Mask掩码 Mat imgMask; threshold(gray, imgMask, 245, 255, THRESH_BINARY); //对Mask掩码膨胀处理,增加Mask的面积 Mat Kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); dilate(imgMask, imgMask, Kernel); //图像修复 Mat imgInpaint; inpaint(img, imgMask, imgInpaint, 5, INPAINT_NS); //显示处理结果 imshow("imgMask", imgMask); imshow("img修复后", imgInpaint); waitKey(0); return 0; }
import cv2
img = cv2.imread("F:\\图像处理\\图片\\待修复图像.png")
if img is None:
print("请检查文件名称是否有误!")
else:
cv2.imshow("img", img)
# 转化为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 通过阈值处理生成Mask掩码
ret, imgMask = cv2.threshold(gray, 245, 255, cv2.THRESH_BINARY)
# 对Mask掩码膨胀处理,增加Mask的面积
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
imgMask = cv2.dilate(imgMask, kernel)
# 图像修复
imgInpaint = cv2.inpaint(img, imgMask, 5, cv2.INPAINT_NS)
# 显示处理结果
cv2.imshow("imgMask", imgMask)
cv2.imshow("img修复后", imgInpaint)
cv2.waitKey(0)
cv2.destroyAllWindows()
OpenCV基于C++,利用区域生长算法实现下图所示焊缝缺陷提取。其算法如下: (1)将图像转换为灰度图 (2)利用较高的阈值分割灰度图像,得到种子区域(threshold) (3)(重点)计算连通域的质心点,获得种子(connectedComponentsWithStats) (4)利用一个偏高的阈值(190)得到遮罩区域(threshold) (5)利用种子、遮罩区域,使用区域生长分割(floodFill),得到缺陷图。代码
以下是基于OpenCV的C++代码实现:
```cpp
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 读入原始图像
Mat src = imread("welding.jpg");
// 转换为灰度图
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
// 较高阈值分割灰度图像,得到种子区域
Mat threshold_img;
threshold(gray, threshold_img, 50, 255, THRESH_BINARY);
// 计算连通域的质心点,获得种子
Mat labels, stats, centroids;
int num_labels = connectedComponentsWithStats(threshold_img, labels, stats, centroids);
// 偏高阈值得到遮罩区域
Mat mask;
threshold(gray, mask, 190, 255, THRESH_BINARY);
// 区域生长分割,得到缺陷图
Mat defect_img = Mat::zeros(src.size(), CV_8UC1);
for (int i = 1; i < num_labels; i++)
{
Point center(cvRound(centroids.at<double>(i, 0)), cvRound(centroids.at<double>(i, 1)));
if (mask.at<uchar>(center) > 0)
{
floodFill(defect_img, labels, center, 255);
}
}
// 显示结果
imshow("Original Image", src);
imshow("Defect Image", defect_img);
waitKey(0);
return 0;
}
```
其中,需要注意的是 `connectedComponentsWithStats()` 函数返回的标签矩阵中,像素值为 0 代表背景,像素值为 1 代表第一个连通域,以此类推。因此,需要从标签矩阵的第二个元素开始遍历。
阅读全文