当前位置: 首页 > news >正文

经典的jq查询网站如何用wordpress做企站

经典的jq查询网站,如何用wordpress做企站,wordpress 学院 模板,网页美工设计师图像形态学 一、像素的距离二、像素的邻域三、膨胀与腐蚀3.1、结构元素3.2、腐蚀3.3、膨胀 四、形态学操作4.1、开运算和闭运算4.2、顶帽和黑帽4.3、形态学梯度4.4、击中击不中 一、像素的距离 图像中像素之间的距离有多种度量方式#xff0c;其中常用的有欧式距离、棋盘距离… 图像形态学 一、像素的距离二、像素的邻域三、膨胀与腐蚀3.1、结构元素3.2、腐蚀3.3、膨胀 四、形态学操作4.1、开运算和闭运算4.2、顶帽和黑帽4.3、形态学梯度4.4、击中击不中 一、像素的距离 图像中像素之间的距离有多种度量方式其中常用的有欧式距离、棋盘距离和街区距离。 1. 欧式距离 欧式距离是指连接两个点的直线距离。欧式距离用数学公式可以表达如下 //勾股定理计算 d^2 (x1-x2)^2(y1-y2)^22. 棋盘距离 棋盘距离也叫切比雪夫距离棋盘距离可以用国际象棋中王的走法来说明也就是王从一个位置走到另一个位置最少需要多少步。 例如王从b3走到g6最少需要几步即b3-c4-d5-e6-f6-g6共5步。不难发现起始位置和终止位置在棋盘上的距离是横向5格纵向3格所以棋盘距离实际上是横向距离与纵向距离之间的较大者用数学公式表达如下 //两个向量在任意坐标维度上的最大差值 d max(|x1-x2|, |y1-y2|)3. 街区距离 街区距离也称为曼哈度距离。与棋盘距离不同在街区距离中只允许横向或纵向移动不允许斜向移动。那么上例中王的两个位置即为8步。用数据公式表达如下 d |x1-x2| |y1-y2|//计算一张图像中非零像素到最近的零像素的距离即到零像素的最短距离 void Imgproc.distanceTransform(Mat src, Mat dst, int dstanceType, int maskSize)src输入图像必须为8位单通道dst含计算距离的输出图像图像深度为CV_8U或CV_32F的单通道图像尺寸与输入图像相同。distanceType距离类型可选参数如下 Imgproc.DIST_USER用户自定义距离Imgproc.DIST_L1街区距离Imgproc.DIST_L2欧式距离Imgproc.DIST_C棋盘距离Imgproc.DIST_L12d2(sqrt(1x*x/2)-1)Imgproc.DIST_FAIRdc^2(|x|/c-log(1|x|/c))其中c1.3998Imgproc.DIST_WELSCHdc^2/2(1-exp(-(x/c)^2))其中c2.9846Imgproc.DIST_HUBERd|x|c ? x^2/2 : c(|x|-c/2)其中c1.345 maskSize距离变化掩码矩阵尺寸可选参数如下 Imgproc.DIST_MASK_3数字值3Imgproc.DIST_MASK_5数字值5Imgproc.DIST_MASK_PRECISE 为了使用加速算法掩码矩阵必须是对称的。在计算欧氏距离时掩码矩阵为3时只是粗略计算像素距离水平和垂直方向的变化量为1对角线方向的变化量为1.4。 public class DistanceTransform {static {OpenCV.loadLocally(); // 自动下载并加载本地库}public static void main(String[] args) {//构建一个5*5的小矩阵并导入数据Mat src new Mat(5, 5, CvType.CV_8UC1);byte[] data new byte[] {1, 1, 1, 1, 1,1, 1, 1, 1, 1,1, 1, 0, 1, 1,1, 1, 1, 1, 1,1, 1,1 ,1 , 1};src.put(0, 0, data);//打印矩阵数据System.out.println(输入矩阵);System.out.println(src.dump());System.out.println();//计算棋盘距离并输出Mat dst new Mat();Imgproc.distanceTransform(src, dst, Imgproc.DIST_C, 3);System.out.println(棋盘距离);System.out.println(dst.dump());System.out.println();//计算街区距离并输出Imgproc.distanceTransform(src, dst, Imgproc.DIST_L1, 3);System.out.println(街区距离);System.out.println(dst.dump());System.out.println();//计算欧氏距离并输出Imgproc.distanceTransform(src, dst, Imgproc.DIST_L2, 3);System.out.println(欧氏距离);System.out.println(dst.dump());System.out.println();} }输入矩阵 [ 1, 1, 1, 1, 1;1, 1, 1, 1, 1;1, 1, 0, 1, 1;1, 1, 1, 1, 1;1, 1, 1, 1, 1]棋盘距离 [2, 2, 2, 2, 2;2, 1, 1, 1, 2;2, 1, 0, 1, 2;2, 1, 1, 1, 2;2, 2, 2, 2, 2]街区距离 [4, 3, 2, 3, 4;3, 2, 1, 2, 3;2, 1, 0, 1, 2;3, 2, 1, 2, 3;4, 3, 2, 3, 4]欧氏距离 [2.7385864, 2.324295, 1.9100037, 2.324295, 2.7385864;2.324295, 1.3692932, 0.95500183, 1.3692932, 2.324295;1.9100037, 0.95500183, 0, 0.95500183, 1.9100037;2.324295, 1.3692932, 0.95500183, 1.3692932, 2.324295;2.7385864, 2.324295, 1.9100037, 2.324295, 2.7385864]上面的程序仅用于说明像素距离的计算方法。利用计算出的距离可以实现很多功能。下面示例说明如何用像素距离实现轮廓的细化 public class Thinning {static {OpenCV.loadLocally(); // 自动下载并加载本地库}public static void main(String[] args) {//读取图像为灰度图Mat image Imgcodecs.imread(/Users/acton_zhang/J2EE/MavenWorkSpace/opencv_demo/src/main/java/demo1/wang.png);Mat gray new Mat();Imgproc.cvtColor(image, gray, Imgproc.COLOR_BGR2GRAY);//将灰度图反相并显示Core.bitwise_not(gray, gray);HighGui.imshow(gray, gray);HighGui.waitKey(0);//进行高斯滤波和二值化处理Imgproc.GaussianBlur(gray, gray, new Size(5, 5), 2);Imgproc.threshold(gray, gray, 20, 255, Imgproc.THRESH_BINARY);HighGui.imshow(Binary, gray);HighGui.waitKey(0);//计算街区距离Mat thin new Mat(gray.size(), CvType.CV_32FC1);Imgproc.distanceTransform(gray, thin, Imgproc.DIST_L1, 3);//获取最大的街区距离float max 0;for (int i 0; i thin.rows(); i) {for (int j 0; j thin.cols(); j) {float[] f new float[3];thin.get(i, j, f);if (f[0] max) {max f[0];}}}//定义用于显示结果的矩阵背景为全黑Mat show Mat.zeros(gray.size(), CvType.CV_8UC1);//将距离符合一定条件的像素设为白色for (int i 0; i thin.rows(); i) {for (int j 0; j thin.cols(); j) {float[] f new float[3];thin.get(i, j, f);if (f[0] max / 3) {show.put(i, j, 255);}}}//在屏幕上显示最后结果HighGui.imshow(thin, show);HighGui.waitKey(0);System.exit(0);} }原图灰度图反相 二值化 通过计算街区距离细化为原来的1/3 二、像素的邻域 像素的邻域是指与某一像素相邻的像素集合。邻域通常分为4邻域、8邻域和D邻域如下图 //4邻域当前像素为中心上、下、左、右4个像素11 P 11//8邻域当前像素为中心上、下、左、右、左上、左下、右上、右下8个像素 1 1 1 1 P 1 1 1 1//D邻域当前像素为中心左上、左下、右上、右下4个像素 1 1P 1 1 8邻域4邻域D邻域OpenCV中有如下函数标记图像中的连通域 int Imgproc.connectedComponents(Mat image, Mat labels, int connectivity, int ltype)image需要标记的8位单通道图像labels标记不同连通域后的输出图像connectivity标记连通域时的邻域种类8代表8邻域4代表4邻域ltype输出图像的标签类型目前支持CV_32S和CV_16Uint返回值连通域个数 public class ConnectedComponents {static {OpenCV.loadLocally(); // 自动下载并加载本地库}public static void main(String[] args) {//读取图像并显示Mat src Imgcodecs.imread(F:/IDEAworkspace/opencv/src/main/java/demo2/seed.png);HighGui.imshow(src, src);HighGui.waitKey(0);//将图像转位灰度图并二值化Mat gray new Mat();Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);Core.bitwise_not(gray, gray);//反相操作Mat binary new Mat();Imgproc.threshold(gray, binary, 0, 255, Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU);//在屏幕显示二值图HighGui.imshow(Binary, binary);HighGui.waitKey(0);//标记连通域Mat labels new Mat(src.size(), CvType.CV_32S);//num为连通域个数int num Imgproc.connectedComponents(binary, labels, 8, CvType.CV_32S);//定义颜色数组用于不同的连通域Scalar[] colors new Scalar[num];//随机生成颜色Random rd new Random();for (int i 0; i num; i) {int r rd.nextInt(256);int g rd.nextInt(256);int b rd.nextInt(256);colors[i] new Scalar(r, g, b);}//标记各连通域dst为用于标记的图像Mat dst new Mat(src.size(), src.type(), new Scalar(255, 255, 255));int width src.cols();int height src.rows();for (int i 0; i height; i) {for (int j 0; j width; j) {//获取标签号int label (int)labels.get(i, j)[0];//黑色背景色不变if (label 0) {continue;}//根据标签号设置颜色double[] val new double[3];val[0] colors[label].val[0];val[1] colors[label].val[1];val[2] colors[label].val[2];dst.put(i, j, val);}}//在屏幕上显示最后结果HighGui.imshow(labelled, dst);HighGui.waitKey(0);System.exit(0);} }原图 二值图 用不同颜色标记后的连通域 //标记图像中的连通域并输出统计信息 int Imgproc.connectedComponentsWithStats(Mat image, Mat labels, Mat stats, Mat centroids)image需要标记的8位单通道图像labels标记不同连通域后的输出图像stats每个标签的统计信息输出含背景标签数据类型为CV_32Scentroids每个连通域的质心坐标数据类型为CV_64F public class ConnectedComponentsWithStats {static {OpenCV.loadLocally(); // 自动下载并加载本地库}public static void main(String[] args) {//读取图像并显示Mat src Imgcodecs.imread(F:/IDEAworkspace/opencv/src/main/java/demo2/seed.png);HighGui.imshow(src, src);HighGui.waitKey(0);//将图像转位灰度图并二值化Mat gray new Mat();Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);Core.bitwise_not(gray, gray);//反相操作Mat binary new Mat();Imgproc.threshold(gray, binary, 0, 255, Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU);//在屏幕显示二值图HighGui.imshow(Binary, binary);HighGui.waitKey(0);//标记连通域Mat labels new Mat(src.size(), CvType.CV_32S);Mat stats new Mat();Mat centroids new Mat();int num Imgproc.connectedComponentsWithStats(binary, labels, stats, centroids);//定义颜色数组用于不同的连通域Scalar[] colors new Scalar[num];//随机生成颜色Random rd new Random();for (int i 0; i num; i) {int r rd.nextInt(256);int g rd.nextInt(256);int b rd.nextInt(256);colors[i] new Scalar(r, g, b);}//标记各连通域dst为用于标记的图像Mat dst new Mat(src.size(), src.type(), new Scalar(255, 255, 255));int width src.cols();int height src.rows();for (int i 0; i height; i) {for (int j 0; j width; j) {//获取标签号int label (int)labels.get(i, j)[0];//将背景以外的连通域设为黑色if (label ! 0) {double[] val new double[]{0, 0, 0};dst.put(i, j, val);}}}//绘制各连通域的质心和外接矩形for (int i 1; i num; i) {//获取连通域中心位置double cx centroids.get(i, 0)[0];double cy centroids.get(i, 1)[0];int left (int)stats.get(i, Imgproc.CC_STAT_LEFT)[0];int top (int)stats.get(i, Imgproc.CC_STAT_TOP)[0];width (int)stats.get(i, Imgproc.CC_STAT_WIDTH)[0];height (int)stats.get(i, Imgproc.CC_STAT_HEIGHT)[0];//绘制连通域质心Imgproc.circle(dst, new Point(cx, cy), 2, new Scalar(0, 0, 255), 2, 8, 0);//绘制连通域外接矩形Imgproc.rectangle(dst, new Point(left, top), new Point(left width, top height), colors[i], 2, 8, 0);}//在屏幕上显示最后结果HighGui.imshow(labelled, dst);HighGui.waitKey(0);System.exit(0);} }原图 二值化 标记质心和外接矩形的连通域图 三、膨胀与腐蚀 3.1、结构元素 腐蚀和膨胀是形态学中最基本的操作其他的形态学操作如开运算、闭运算、顶帽、黑帽等本质上都是腐蚀和膨胀的组合运算。形态学一般需要两个输入参数一个是用于操作的图像另一个是类似卷积核的元素称为结构元素。结构元素还有一个用于定位的参考点称为锚点。 //根据指定的尺寸和形状生成形态学操作的结构元素 Mat Imgproc.getStructuringElement(int shape, Size ksize, Point anchor)shape结构元素的形状有下列选项 Imgproc.MORPH_RECT矩形结构元素Imgproc.MORPH_CROSS十字型结构元素Imgproc.MORPH_ELLIPSE椭圆结构元素矩形的内接椭圆 ksize结构元素的尺寸anchor结构元素内的锚点默认值(-1, -1)表示锚点位于结构元素中心。只有十字型的结构元素的形状取决于锚点的位置。其他情况仅仅用于调节形态学操作结果的平移量。 public class StructureElement {static {OpenCV.loadLocally(); // 自动下载并加载本地库}public static void main(String[] args) {//矩形结构元素Mat k0 Imgproc.getStructuringElement(0, new Size(3, 3));System.out.println(k0.dump());System.out.println();//十字型结构元素Mat k1 Imgproc.getStructuringElement(1, new Size(3, 3));System.out.println(k1.dump());System.out.println();//椭圆结构元素Mat k2 Imgproc.getStructuringElement(2, new Size(7, 7));System.out.println(k2.dump());System.out.println();} }[ 1, 1, 1;1, 1, 1;1, 1, 1][ 0, 1, 0;1, 1, 1;0, 1, 0][ 0, 0, 0, 1, 0, 0, 0;0, 1, 1, 1, 1, 1, 0;1, 1, 1, 1, 1, 1, 1;1, 1, 1, 1, 1, 1, 1;1, 1, 1, 1, 1, 1, 1;0, 1, 1, 1, 1, 1, 0;0, 0, 0, 1, 0, 0, 0]3.2、腐蚀 腐蚀是求局部最小值的操作。经过腐蚀操作后图像中的高亮区域会缩小就像被腐蚀了一样。 腐蚀运算的原理如下图原图像标有1的像素为高亮区域结构元素中心的像素为锚点。腐蚀操作时用结构元素扫描原图像用结构元素与覆盖区域的像素进行与运算如果所有像素的运算结果都是1则该像素值为1否则为0。 //原图像 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 0 0 0 0 0 1 1 0 0//结构元素 0 1 0 1 1 1 0 1 0//腐蚀运算结果 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0可以发现原图像中高亮区域有15像素经过腐蚀操作后只有3像素了所以的结构相当于给高亮区域瘦身瘦身的效果取决于结构元素而结构元素可以根据需求自行定义。需要注意的是腐蚀操作及膨胀操作等形态学操作都是针对高亮区域。如果原图像是黑白二值图像则被腐蚀的是白色区域如果希望黑色区域被腐蚀则可以在操作前先进行反向操作。 //用特定的结构元素对图像进行腐蚀操作 void Imgproc.erode(Mat src, Mat dst, Mat kernel, Point anchor, int iterations)src输入图像通道数任意但深度应为CV_8U、CV_16U、CV_16S、CV_32F或CV_64Fdst输出图像和src具有相同的尺寸和数据类型kernel用于腐蚀操作的结构元素可以用getStructuringElement()函数生成anchor结构元素内锚点的位置默认(-1, -1)表示锚点位于结构元素中心iterations腐蚀的次数 此方法可以设置迭代次数即一次完成多次腐蚀操作。如果只需腐蚀一次则可将后两个参数省略。 public class Erode {static {OpenCV.loadLocally(); // 自动下载并加载本地库}public static void main(String[] args) {//读取图像并显示Mat src Imgcodecs.imread(F:/IDEAworkspace/opencv/src/main/java/demo/wang.png);HighGui.imshow(src, src);HighGui.waitKey(0);//将图像反向并显示Core.bitwise_not(src, src);HighGui.imshow(negative, src);HighGui.waitKey(0);//生成十字型结构元素Mat kernel Imgproc.getStructuringElement(1, new Size(3, 3));Point anchor new Point(-1, -1);//腐蚀操作1次并显示Mat dst new Mat();Imgproc.erode(src, dst, new Mat());HighGui.imshow(erode1, dst);HighGui.waitKey(0);//腐蚀操作3次并显示Imgproc.erode(src, dst, kernel, anchor, 3);HighGui.imshow(erode3, dst);HighGui.waitKey(0);System.exit(0);} }原图 反向 一次腐蚀 三次腐蚀 上面的示例只能看到腐蚀的结构无法对腐蚀的细节进行研究。下面用一个完整的程序说明 public class Erode2 {static {OpenCV.loadLocally(); // 自动下载并加载本地库}public static void main(String[] args) {//构建一个6*6的小矩阵并导入数据Mat src new Mat(6, 6, CvType.CV_8UC1);byte[] data new byte[] {0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,0,0};src.put(0, 0, data);//打印矩阵System.out.println(src.dump());System.out.println();//构建十字型结构元素Mat kernel Imgproc.getStructuringElement(1, new Size(3, 3));Mat dst new Mat(6, 6, CvType.CV_8UC1);//进行腐蚀操作并输出腐蚀后的矩阵Imgproc.erode(src, dst, kernel);System.out.println(dst.dump());} }[ 0, 0, 0, 0, 0, 0;0, 0, 1, 1, 1, 0;0, 1, 1, 1, 1, 0;0, 1, 1, 1, 1, 0;0, 1, 1, 0, 0, 0;0, 0, 1, 1, 0, 0][ 0, 0, 0, 0, 0, 0;0, 0, 0, 0, 0, 0;0, 0, 1, 1, 0, 0;0, 0, 1, 0, 0, 0;0, 0, 0, 0, 0, 0;0, 0, 0, 0, 0, 0]3.3、膨胀 与腐蚀相反膨胀则是求局部最大值的操作。经过膨胀操作后图像中的高亮区域会扩大就像受热膨胀一样。膨胀运算原理如下原图像中标有1的像素为高亮区域结构元素中心的像素为锚点。进行膨胀操作时用结构元素扫描原图像用结构元素与覆盖区域的像素进行与运算如果所有像素的运算结构都是0则该像素值为0否则为1。膨胀运算前高亮区域有15像素经过膨胀操作后扩充为29像素所以膨胀的结果让高亮区域长胖了。 //原图像 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 0 0 0 0 0 1 1 0 0//结构元素 0 1 0 1 1 1 0 1 0//膨胀运算结果 0 0 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 0//用特定的结构元素对图像进行膨胀操作 void Imgproc.dilate(Mat src, Mat dst, Mat kernel, Point anchor, int iterations)src输入图像通道数任意但深度应为CV_8U、CV_16U、CV_16S、CV_32F或CV_64Fdst输出图像和src具有相同的尺寸和数据类型kernel用于膨胀操作的结构元素可以用getStructuringElement()函数生成anchor结构元素内锚点的位置默认(-1, -1)表示锚点位于结构元素中心iterations膨胀的次数 public class Dilate {static {OpenCV.loadLocally(); // 自动下载并加载本地库}public static void main(String[] args) {//读取图像并显示Mat src Imgcodecs.imread(F:/IDEAworkspace/opencv/src/main/java/demo/wang.png);HighGui.imshow(src, src);HighGui.waitKey(0);//将图像反向并显示Core.bitwise_not(src, src);HighGui.imshow(negative, src);HighGui.waitKey(0);//生成十字型结构元素Mat kernel Imgproc.getStructuringElement(1, new Size(3, 3));Point anchor new Point(-1, -1);//膨胀操作1次并显示Mat dst new Mat();Imgproc.dilate(src, dst, new Mat());HighGui.imshow(dilate1, dst);HighGui.waitKey(0);//腐蚀操作3次并显示Imgproc.dilate(src, dst, kernel, anchor, 3);HighGui.imshow(dilate3, dst);HighGui.waitKey(0);System.exit(0);} }原图 反向 膨胀一次 膨胀三次 四、形态学操作 腐蚀和膨胀操作时图像形态学的基础。通过对腐蚀和膨胀操作进行不同的组合可以实现图像的开运算、闭运算、形态学梯度、顶帽运算、黑帽运算和击中击不中等操作。 这些操作在OpenCV中都使用morphologyEx()函数实现只是其中的参数不同。该函数如下 //对图像进行基于腐蚀和膨胀的高级形态学操作 void Imgproc.morphologyEx(Mat src, Mat dst, int op, Mat kernel, Point anchor, int iterations)src输入图像通道数任意但深度应为CV_8U、CV_16U、CV_16S、CV_32F或CV_64Fdst输出图像和src具有相同的尺寸和数据类型op形态学操作的类型具体有以下几种 Imgproc.MORPH_ERODE腐蚀操作Imgproc.MORPH_DILATE膨胀操作Imgproc.MORPH_OPEN开运算Imgproc.MORPH_CLOSE闭运算Imgproc.MORPH_GRADIENT形态学梯度Imgproc.MORPH_TOPHAT顶帽运算Imgproc.MORPH_BLACKHAT黑帽运算Imgproc.MORPH_HITMISS击中击不中。只支持CV_8UC1类型的二值图像 kernel结构元素可以用getStructuringElement函数生成anchor结构元素内锚点的位置负数表示锚点位于结构元素中心iterations腐蚀和膨胀的次数 4.1、开运算和闭运算 开运算是对图像先腐蚀后膨胀的过程它可以用来去除噪声、去除细小的形状如毛刺或在轻微连接处分离物体等。腐蚀操作同样能去掉毛刺但是腐蚀操作后高亮区域整个廋了一圈形态发生了明显变化而开运算能在去掉毛刺的同时又保持原来的大小。 与开运算相反的操作是闭预算。闭运算是对图像先膨胀后腐蚀的过程。闭算远可以去除小型空洞还能将狭窄的缺口连接起来。 public class MorphologyEx1 {static {OpenCV.loadLocally(); // 自动下载并加载本地库}public static void main(String[] args) {//读取图像并显示Mat src Imgcodecs.imread(/Users/acton_zhang/J2EE/MavenWorkSpace/opencv_demo/src/main/java/demo1/butterfly2.png);HighGui.imshow(src, src);HighGui.waitKey(0);Mat dst new Mat();//闭运算1次并显示Point anchor new Point(-1, -1);Imgproc.morphologyEx(src, dst, Imgproc.MORPH_CLOSE, new Mat(), anchor, 1);HighGui.imshow(Close-1, dst);HighGui.waitKey(0);//闭运算3次并显示Imgproc.morphologyEx(src, dst, Imgproc.MORPH_CLOSE, new Mat(), anchor, 3);HighGui.imshow(Close-3, dst);HighGui.waitKey(0);//在3次闭运算的基础上进行开运算并显示Imgproc.morphologyEx(dst, dst, Imgproc.MORPH_OPEN, new Mat(), anchor, 1);HighGui.imshow(Open, dst);HighGui.waitKey(0);System.exit(0);} }原图 闭运算1次 闭运算3次 开运算一次 输入图像是一只蝴蝶的轮廓图经过1次闭运算后部分空洞消失3次闭运算后大量空洞消失在此基础上进行1次开运算使很多轮廓线消失。 4.2、顶帽和黑帽 顶帽运算也称为礼貌运算是计算原图像与开运算结果之差的操作。由于开运算后放大了裂缝或者局部低亮度的区域从原图中减去开运算后的图像后就突出了比原图像轮廓周边区域更明亮的区域。 黑帽运算则是计算闭运算结果与原图像之差的操作。黑帽运算后突出了比原图像轮廓周边区域更暗的区域。 public class MorphologyEx2 {static {OpenCV.loadLocally(); // 自动下载并加载本地库}public static void main(String[] args) {//读取图像并显示Mat src Imgcodecs.imread(/Users/acton_zhang/J2EE/MavenWorkSpace/opencv_demo/src/main/java/demo1/shaomai.png);HighGui.imshow(src, src);HighGui.waitKey(0);Mat dst new Mat();//转换为二值图并显示Imgproc.threshold(src, src, 120, 255, Imgproc.THRESH_BINARY);HighGui.imshow(Binary, src);HighGui.waitKey(0);//顶帽运算3次并显示Point anchor new Point(-1, -1);Imgproc.morphologyEx(src, dst, Imgproc.MORPH_TOPHAT, new Mat(), anchor, 3);HighGui.imshow(Tophat, dst);HighGui.waitKey(0);//黑帽运算3次并显示Imgproc.morphologyEx(src, dst, Imgproc.MORPH_BLACKHAT, new Mat(), anchor, 3);HighGui.imshow(Blackhat, dst);HighGui.waitKey(0);System.exit(0);} }原图 二值图 顶帽3次 黑帽3次 4.3、形态学梯度 形态学梯度是计算膨胀结果与腐蚀结果之差的操作其结果看上去就像图像的轮廓。 public class MorphologyEx3 {static {OpenCV.loadLocally(); // 自动下载并加载本地库}public static void main(String[] args) {//读取图像1并显示Mat src1 Imgcodecs.imread(/Users/acton_zhang/J2EE/MavenWorkSpace/opencv_demo/src/main/java/demo1/shaomai.png);HighGui.imshow(src1, src1);HighGui.waitKey(0);//形态学梯度并显示Point anchor new Point(-1, -1);Mat dst new Mat();Imgproc.morphologyEx(src1, dst, Imgproc.MORPH_GRADIENT, new Mat(), anchor, 1);HighGui.imshow(Gradient1, dst);HighGui.waitKey(0);//读取图像2并显示Mat src2 Imgcodecs.imread(/Users/acton_zhang/J2EE/MavenWorkSpace/opencv_demo/src/main/java/demo1/wang.png, Imgcodecs.IMREAD_GRAYSCALE);HighGui.imshow(src2, src2);HighGui.waitKey(0);//形态学梯度并显示Imgproc.morphologyEx(src2, dst, Imgproc.MORPH_GRADIENT, new Mat(), anchor, 1);HighGui.imshow(Gradient2, dst);HighGui.waitKey(0);System.exit(0);} }原图1 形态学梯度 原图2 形态学梯度 4.4、击中击不中 击中击不中运算常用于二值图像它的要求比腐蚀操作还要严格。只有当结构元素与其覆盖的区域完全相同时该像素才为1否则为0如下 //原图 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 0 1 0 0 1 1 1 1 1 0 0 0 0 0 0//结构元素 1 1 1 1 0 1 1 1 1//击中击不中结果 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0public class HitMiss {static {OpenCV.loadLocally(); // 自动下载并加载本地库}public static void main(String[] args) {//构建一个6*6的小矩阵并导入数据Mat src new Mat(6, 6, CvType.CV_8UC1);byte[] data new byte[] {0, 0, 0, 0, 0, 0,0, 0, 1, 1, 1, 0,0, 1, 1, 1, 1, 0,0, 1, 1, 1, 1, 0,0, 1, 1, 0, 0, 0,0, 0, 1, 1, 0, 0};src.put(0, 0, data);//打印矩阵输出System.out.println(src.dump());System.out.println();//构建矩形结构元素并输出Mat kernel Imgproc.getStructuringElement(0, new Size(3, 3));System.out.println(kernel.dump());System.out.println();//击中击不中测试并输出Point anchor new Point(-1, -1);Mat dst new Mat(6, 6, CvType.CV_8UC1);Imgproc.morphologyEx(src, dst, Imgproc.MORPH_HITMISS, kernel, anchor, 1);System.out.println(dst.dump());} }[ 0, 0, 0, 0, 0, 0;0, 0, 1, 1, 1, 0;0, 1, 1, 1, 1, 0;0, 1, 1, 1, 1, 0;0, 1, 1, 0, 0, 0;0, 0, 1, 1, 0, 0][ 1, 1, 1;1, 1, 1;1, 1, 1][ 0, 0, 0, 0, 0, 0;0, 0, 0, 0, 0, 0;0, 0, 0, 1, 0, 0;0, 0, 0, 0, 0, 0;0, 0, 0, 0, 0, 0;0, 0, 0, 0, 0, 0]
http://www.hkea.cn/news/14529588/

相关文章:

  • 烟台优化网站建设水泥网站营销方案怎么做
  • 怎么在搜索引擎里做网站网页创作网
  • 厦门做企业网站找谁wordpress要不要付费
  • 网站推广 扬州wordpress 查看版本
  • 自助建网站哪个好静态网页代码大全
  • flash 学习网站wordpress做后端
  • 网站如何添加百度统计自己开发一个app要多少钱
  • 网站建设投标书服务方案范本电子商务网站硬件建设的核心
  • 辽宁省住房和建设厅网站泉州做网站工资
  • 网站建设首页外卖网站 模板
  • 自学移动端网站开发搜狐酒业峰会
  • 网站页面网站产品要如何做详情
  • 在网站后台可以修改网页的内容室内设计模拟app
  • 黄骅做网站价格南宁设计网站
  • 优惠券推广网站怎么做初学者3d建模要什么软件
  • 网站关键词用什么隔开做网站第一步要干啥
  • Wordpress网站防止采集网站logo模板
  • 动态ip怎么做网站网站域名重定向
  • 伊利集团网站建设怎么样呢线上线下购物商城系统
  • 长春网站建设电话咨询产品线下推广方式都有哪些
  • php 网站做分享功能重庆市建设安全信息网
  • now9999网站提示建设中排行网页游戏
  • 滁州网站建设梦天堂dw成品网站成品视频教学
  • 备案号是哪个网站网站的title
  • 网站建设微商城主流网络推广平台
  • 免费做网站有哪些家怎么黑入网站
  • 怎么做二次元网站源码郑州网站建设方案优化
  • html教学网站网站 cms
  • 哪里学网站开发洪梅仿做网站
  • 网站外链建设记住5种外链方式不可用前台和后台网站开发的区别