Merge pull request #9049 from Cartucho:improve_mask_tutorial_codes

This commit is contained in:
Alexander Alekhin 2017-08-21 07:14:45 +00:00
commit 89172c08a2
3 changed files with 153 additions and 104 deletions

View File

@ -12,7 +12,7 @@ static void help(char* progName)
<< "This program shows how to filter images with mask: the write it yourself and the" << "This program shows how to filter images with mask: the write it yourself and the"
<< "filter2d way. " << endl << "filter2d way. " << endl
<< "Usage:" << endl << "Usage:" << endl
<< progName << " [image_name -- default ../data/lena.jpg] [G -- grayscale] " << endl << endl; << progName << " [image_path -- default ../data/lena.jpg] [G -- grayscale] " << endl << endl;
} }
@ -45,7 +45,7 @@ int main( int argc, char* argv[])
Sharpen( src, dst0 ); Sharpen( src, dst0 );
t = ((double)getTickCount() - t)/getTickFrequency(); t = ((double)getTickCount() - t)/getTickFrequency();
cout << "Hand written function times passed in seconds: " << t << endl; cout << "Hand written function time passed in seconds: " << t << endl;
imshow( "Output", dst0 ); imshow( "Output", dst0 );
waitKey(); waitKey();

View File

@ -1,64 +1,73 @@
import org.opencv.core.*; import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc; import org.opencv.imgproc.Imgproc;
import javax.swing.*; import javax.swing.*;
import java.awt.Image; import java.awt.*;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte; import java.awt.image.DataBufferByte;
class MatMaskOperationsRun { class MatMaskOperationsRun {
public void run() { public void run(String[] args) {
//! [laod_image] String filename = "../data/lena.jpg";
Mat I = Imgcodecs.imread("../data/lena.jpg");
if(I.empty())
System.out.println("Error opening image");
//! [laod_image]
Image img = toBufferedImage( I ); int img_codec = Imgcodecs.IMREAD_COLOR;
displayImage("Input Image" , img, 0, 200 ); if (args.length != 0) {
filename = args[0];
if (args.length >= 2 && args[1].equals("G"))
img_codec = Imgcodecs.IMREAD_GRAYSCALE;
}
Mat src = Imgcodecs.imread(filename, img_codec);
if (src.empty()) {
System.out.println("Can't open image [" + filename + "]");
System.out.println("Program Arguments: [image_path -- default ../data/lena.jpg] [G -- grayscale]");
System.exit(-1);
}
Image img = toBufferedImage(src);
displayImage("Input", img, 0, 200);
double t = System.currentTimeMillis(); double t = System.currentTimeMillis();
Mat J = sharpen(I, new Mat()); Mat dst0 = sharpen(src, new Mat());
t = ((double) System.currentTimeMillis() - t) / 1000; t = ((double) System.currentTimeMillis() - t) / 1000;
System.out.println("Hand written function times passed in seconds: " + t); System.out.println("Hand written function time passed in seconds: " + t);
Image img2 = toBufferedImage( J ); Image img2 = toBufferedImage(dst0);
displayImage("Output Image" , img2, 400, 400 ); displayImage("Output", img2, 400, 400);
Mat K = new Mat();
//![kern] //![kern]
Mat kern = new Mat(3, 3, CvType.CV_8S); Mat kern = new Mat(3, 3, CvType.CV_8S);
int row = 0, col = 0; int row = 0, col = 0;
kern.put(row, col, 0, -1, 0, -1, 5, -1, 0, -1, 0); kern.put(row, col, 0, -1, 0, -1, 5, -1, 0, -1, 0);
//![kern] //![kern]
System.out.println("kern = \n" + kern.dump());
t = System.currentTimeMillis(); t = System.currentTimeMillis();
Mat dst1 = new Mat();
//![filter2D] //![filter2D]
Imgproc.filter2D(I, K, I.depth(), kern ); Imgproc.filter2D(src, dst1, src.depth(), kern);
//![filter2D] //![filter2D]
t = ((double) System.currentTimeMillis() - t) / 1000; t = ((double) System.currentTimeMillis() - t) / 1000;
System.out.println("Built-in filter2D time passed in seconds: " + t); System.out.println("Built-in filter2D time passed in seconds: " + t);
Image img3 = toBufferedImage( J ); Image img3 = toBufferedImage(dst1);
displayImage("filter2D Output Image" , img3, 800, 400 ); displayImage("Output", img3, 800, 400);
} }
//! [basic_method] //! [basic_method]
public static double saturateCastUchar(double x) { public static double saturate(double x) {
return x > 255.0 ? 255.0 : (x < 0.0 ? 0.0 : x); return x > 255.0 ? 255.0 : (x < 0.0 ? 0.0 : x);
} }
public Mat sharpen(Mat myImage, Mat Result) public Mat sharpen(Mat myImage, Mat Result) {
{
//! [8_bit] //! [8_bit]
myImage.convertTo(myImage, CvType.CV_8U); myImage.convertTo(myImage, CvType.CV_8U);
//! [8_bit] //! [8_bit]
@ -69,10 +78,8 @@ class MatMaskOperationsRun {
//! [create_channels] //! [create_channels]
//! [basic_method_loop] //! [basic_method_loop]
for(int j = 1 ; j < myImage.rows()-1; ++j) for (int j = 1; j < myImage.rows() - 1; ++j) {
{ for (int i = 1; i < myImage.cols() - 1; ++i) {
for(int i = 1 ; i < myImage.cols()-1; ++i)
{
double sum[] = new double[nChannels]; double sum[] = new double[nChannels];
for (int k = 0; k < nChannels; ++k) { for (int k = 0; k < nChannels; ++k) {
@ -83,7 +90,7 @@ class MatMaskOperationsRun {
double left = -myImage.get(j, i - 1)[k]; double left = -myImage.get(j, i - 1)[k];
double right = -myImage.get(j, i + 1)[k]; double right = -myImage.get(j, i + 1)[k];
sum[k] = saturateCastUchar(top + bottom + center + left + right); sum[k] = saturate(top + bottom + center + left + right);
} }
Result.put(j, i, sum); Result.put(j, i, sum);
@ -116,8 +123,7 @@ class MatMaskOperationsRun {
return image; return image;
} }
public void displayImage(String title, Image img, int x, int y) public void displayImage(String title, Image img, int x, int y) {
{
ImageIcon icon = new ImageIcon(img); ImageIcon icon = new ImageIcon(img);
JFrame frame = new JFrame(title); JFrame frame = new JFrame(title);
JLabel lbl = new JLabel(icon); JLabel lbl = new JLabel(icon);
@ -131,9 +137,9 @@ class MatMaskOperationsRun {
public class MatMaskOperations { public class MatMaskOperations {
public static void main(String[] args) { public static void main(String[] args) {
// Load the native library. // Load the native library.
System.loadLibrary(Core.NATIVE_LIBRARY_NAME); System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
new MatMaskOperationsRun().run();
new MatMaskOperationsRun().run(args); // run code
} }
} }

View File

@ -1,41 +1,79 @@
import sys
import time import time
import numpy as np import numpy as np
import cv2 import cv2
## [basic_method]
def sharpen(my_image):
my_image = cv2.cvtColor(my_image, cv2.CV_8U)
## [basic_method]
def is_grayscale(my_image):
return len(my_image.shape) < 3
def saturated(sum_value):
if sum_value > 255:
sum_value = 255
if sum_value < 0:
sum_value = 0
return sum_value
def sharpen(my_image):
if is_grayscale(my_image):
height, width = my_image.shape
else:
my_image = cv2.cvtColor(my_image, cv2.CV_8U)
height, width, n_channels = my_image.shape height, width, n_channels = my_image.shape
result = np.zeros(my_image.shape, my_image.dtype) result = np.zeros(my_image.shape, my_image.dtype)
## [basic_method_loop] ## [basic_method_loop]
for j in range(1, height - 1): for j in range(1, height - 1):
for i in range(1, width - 1): for i in range(1, width - 1):
if is_grayscale(my_image):
sum_value = 5 * my_image[j, i] - my_image[j + 1, i] - my_image[j - 1, i] \
- my_image[j, i + 1] - my_image[j, i - 1]
result[j, i] = saturated(sum_value)
else:
for k in range(0, n_channels): for k in range(0, n_channels):
sum = 5 * my_image[j, i, k] - my_image[j + 1, i, k] - my_image[j - 1, i, k]\ sum_value = 5 * my_image[j, i, k] - my_image[j + 1, i, k] - my_image[j - 1, i, k] \
- my_image[j, i + 1, k] - my_image[j, i - 1, k]; - my_image[j, i + 1, k] - my_image[j, i - 1, k]
result[j, i, k] = saturated(sum_value)
if sum > 255:
sum = 255
if sum < 0:
sum = 0
result[j, i, k] = sum
## [basic_method_loop] ## [basic_method_loop]
return result return result
## [basic_method] ## [basic_method]
I = cv2.imread("../data/lena.jpg") def main(argv):
cv2.imshow('Input Image', I) filename = "../data/lena.jpg"
img_codec = cv2.IMREAD_COLOR
if argv:
filename = sys.argv[1]
if len(argv) >= 2 and sys.argv[2] == "G":
img_codec = cv2.IMREAD_GRAYSCALE
src = cv2.imread(filename, img_codec)
if src is None:
print "Can't open image [" + filename + "]"
print "Usage:\nmat_mask_operations.py [image_path -- default ../data/lena.jpg] [G -- grayscale]"
return -1
cv2.namedWindow("Input", cv2.WINDOW_AUTOSIZE)
cv2.namedWindow("Output", cv2.WINDOW_AUTOSIZE)
cv2.imshow("Input", src)
t = round(time.time()) t = round(time.time())
J = sharpen(I)
t = (time.time() - t)/1000
print "Hand written function times passed in seconds: %s" % t
cv2.imshow('Output Image', J) dst0 = sharpen(src)
t = (time.time() - t) / 1000
print "Hand written function time passed in seconds: %s" % t
cv2.imshow("Output", dst0)
cv2.waitKey()
t = time.time() t = time.time()
## [kern] ## [kern]
@ -45,13 +83,18 @@ kernel = np.array([ [0,-1,0],
## [kern] ## [kern]
## [filter2D] ## [filter2D]
K = cv2.filter2D(I, -1, kernel) # ddepth = -1, means destination image has depth same as input image. dst1 = cv2.filter2D(src, -1, kernel) # ddepth = -1, means destination image has depth same as input image
## [filter2D] ## [filter2D]
t = (time.time() - t) / 1000 t = (time.time() - t) / 1000
print "Built-in filter2D time passed in seconds: %s" % t print "Built-in filter2D time passed in seconds: %s" % t
cv2.imshow('filter2D Output Image', K) cv2.imshow("Output", dst1)
cv2.waitKey(0) cv2.waitKey(0)
cv2.destroyAllWindows() cv2.destroyAllWindows()
return 0
if __name__ == "__main__":
main(sys.argv[1:])