Chúng ta có thể tìm màu nào chiếm ưu thế trong hình ảnh bằng cách sử dụng java, imagemagick hoặc jmagick không?Làm thế nào tôi có thể tìm thấy màu chủ đạo của một hình ảnh?
Trả lời
trong java lặp trên mỗi pixel và xác định màu
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
public class ImageTester {
public static void main(String args[]) throws Exception {
File file = new File("C:\\Users\\Andrew\\Desktop\\myImage.gif");
ImageInputStream is = ImageIO.createImageInputStream(file);
Iterator iter = ImageIO.getImageReaders(is);
if (!iter.hasNext())
{
System.out.println("Cannot load the specified file "+ file);
System.exit(1);
}
ImageReader imageReader = (ImageReader)iter.next();
imageReader.setInput(is);
BufferedImage image = imageReader.read(0);
int height = image.getHeight();
int width = image.getWidth();
Map m = new HashMap();
for(int i=0; i < width ; i++)
{
for(int j=0; j < height ; j++)
{
int rgb = image.getRGB(i, j);
int[] rgbArr = getRGBArr(rgb);
// Filter out grays....
if (!isGray(rgbArr)) {
Integer counter = (Integer) m.get(rgb);
if (counter == null)
counter = 0;
counter++;
m.put(rgb, counter);
}
}
}
String colourHex = getMostCommonColour(m);
System.out.println(colourHex);
}
public static String getMostCommonColour(Map map) {
List list = new LinkedList(map.entrySet());
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
return ((Comparable) ((Map.Entry) (o1)).getValue())
.compareTo(((Map.Entry) (o2)).getValue());
}
});
Map.Entry me = (Map.Entry)list.get(list.size()-1);
int[] rgb= getRGBArr((Integer)me.getKey());
return Integer.toHexString(rgb[0])+" "+Integer.toHexString(rgb[1])+" "+Integer.toHexString(rgb[2]);
}
public static int[] getRGBArr(int pixel) {
int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel) & 0xff;
return new int[]{red,green,blue};
}
public static boolean isGray(int[] rgbArr) {
int rgDiff = rgbArr[0] - rgbArr[1];
int rbDiff = rgbArr[0] - rgbArr[2];
// Filter out black, white and grays...... (tolerance within 10 pixels)
int tolerance = 10;
if (rgDiff > tolerance || rgDiff < -tolerance)
if (rbDiff > tolerance || rbDiff < -tolerance) {
return false;
}
return true;
}
}
Sử dụng java đơn giản bạn chỉ có thể lặp qua mỗi pixel và đếm mức độ thường xuyên mỗi màu được chứa ...
pseudo-code:
Map<Color, Integer> color2counter;
for (x : width) {
for (y : height) {
color = image.getPixel(x, y)
occurrences = color2counter.get(color)
color2counter.put(color, occurrences + 1)
}
}
giả sử sử dụng bảng phối màu phụ gia, trong đó (0,0,0) là màu đen và (255, 255, 255) là màu trắng (đúng nếu tôi nhầm). Ngoài ra, nếu bạn chỉ muốn tìm màu chủ đạo của RGB:
Một ý tưởng mà bạn có, miễn là xem xét 3 biến mà mỗi giá trị lưu trữ một trong các giá trị RGB và thêm vào mỗi chúng là giá trị thích hợp của mỗi điểm ảnh trong hình ảnh và sau đó chia cho (255 * numOfPixels) để có được tỷ lệ màu sắc. Sau đó so sánh 3 tỷ lệ: .60 cho màu đỏ và 0,5 cho màu xanh lá cây có nghĩa là màu đỏ chiếm ưu thế hơn.
Đây chỉ là ý tưởng và có thể cần tinh chỉnh ...
tôi sử dụng jamagick cho màu sắc được sử dụng như loại RGB nhưng với cách này tôi chỉ có thể tìm thấy clor avarage của hình ảnh. Nhưng tôi có một ý tưởng tôi có thể cắt hình ảnh của giữa vì vậy tôi có thể tìm thấy màu sắc avarage của phần đó nó sẽ cung cấp cho gần như cùng một màu sắc một lần nữa. Tôi chỉ tìm thấy màu chủ đạo:/ –
@ ErçinAkçay Nếu bạn muốn cắt hình ảnh, chắc chắn bạn muốn màu chính ở biên giới. ví dụ. nói rằng bạn có một hình vuông lớn được bao quanh bởi màu trắng. Bạn muốn phát hiện màu trắng để cắt, không phải hình vuông. –
Đây là một vấn đề phức tạp. Ví dụ: nếu bạn có một khu vực nhỏ có cùng màu sắc và diện tích lớn với các màu hơi khác nhau, thì chỉ cần tìm màu được sử dụng nhiều nhất là không thể cho bạn kết quả mong muốn. Bạn sẽ nhận được kết quả tốt hơn bằng cách xác định một tập hợp các màu và, đối với mỗi dải, các giá trị RGB mà bạn cho là 'là' màu đó.
Chủ đề này đã được thảo luận tại chiều dài trên máy chủ thuyết ImageMagick, ví dụ: http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=12878
tôi vừa phát hành một thuật toán rất đơn giản mà có thể được dịch bằng Java trivially. Nó được gọi là color-finder và hoạt động trong JavaScript.
Các giải pháp được đề xuất trong chuỗi này có thể được ném ra bởi một vài ký tự trắng trong hình ảnh, trong khi tôi thực sự cố gắng tìm màu nổi bật nhất, ngay cả khi tất cả các pixel không thực sự chính xác cùng màu.
Hãy cho tôi biết nếu bạn thấy hữu ích.
- 1. Tìm màu chủ đạo của ảnh trong Android @drawable
- 2. Lấy (các) màu chủ đạo của hình ảnh
- 3. Python - Tìm màu chủ đạo/phổ biến nhất trong một hình ảnh
- 4. Làm cách nào để tự động phân loại hình ảnh theo màu chủ đạo?
- 5. Django: Làm thế nào tôi có thể tìm thấy mô hình nào của tôi đề cập đến một mô hình
- 6. Tại sao hình ảnh của tôi không tìm thấy trên máy chủ web của tôi?
- 7. Làm thế nào tôi có thể tìm thấy cực đại cục bộ trong một hình ảnh trong MATLAB?
- 8. Làm thế nào tôi có thể tìm thấy OWNER của một đối tượng trong Oracle?
- 9. Làm thế nào tôi có thể tìm thấy trung tâm của đối tượng?
- 10. Nhận các màu chủ đạo từ việc loại bỏ hình ảnh nền
- 11. Làm thế nào tôi có thể tìm thấy hình dạng alpha (lõm lõm) của một đám mây điểm 2d?
- 12. Làm thế nào tôi có thể tìm thấy điểm giao nhau của ba mặt phẳng?
- 13. Làm thế nào tôi có thể tìm thấy giao điểm của hai truy vấn Django?
- 14. Làm thế nào tôi có thể tìm thấy sự kết hợp của hai truy vấn Django?
- 15. Tìm hình ảnh có màu tương tự
- 16. Làm thế nào tôi có thể tìm thấy plugin VIM nào có lỗi vì quá tải CPU của tôi
- 17. Thay thế một màu cụ thể bằng một hình ảnh/hình ảnh khác
- 18. Trong mercurial làm thế nào tôi có thể tìm thấy changesets có chứa một chuỗi?
- 19. Tôi có thể có một UIBarButtonItem với một hình ảnh màu?
- 20. nơi tôi có thể tìm thấy hình ảnh chấm nhỏ màu đỏ được sử dụng trong bản đồ google?
- 21. Làm thế nào tôi có thể tìm thấy đường dẫn đến một bao gồm trong Symfony2?
- 22. Tìm màu điểm ảnh cụ thể của một BitmapImage
- 23. Làm thế nào tôi có thể tìm thấy số lượng khóa trong một băm trong Perl?
- 24. jQuery - làm thế nào tôi có thể tìm thấy nếu một id có một chuỗi cụ thể?
- 25. Làm thế nào để thay đổi một màu cụ thể trong một hình ảnh?
- 26. Sử dụng imagemagick làm thế nào tôi có thể cắt một hình ảnh thành một số hình ảnh riêng biệt?
- 27. làm thế nào để làm cho hình ảnh của tôi có thể bấm
- 28. Làm thế nào tôi có thể tìm thấy tr của cha mẹ của một td bằng cách sử dụng jQuery?
- 29. TCPDF: Làm thế nào tôi có thể đặt một hình ảnh vào một khối HTML?
- 30. Làm thế nào để tìm góc quay của hình ảnh?
Bạn có ý nghĩa bóng được sử dụng nhiều nhất trong hình ảnh hoặc màu trung bình không? –